/ Hex Artifact Content
Login

Artifact c53e2683d8cc23d08f28dbecf0e3c2bcf1d1acca:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61  if../*.** standa
0c30: 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73  rd include files
0c40: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  ..*/.#include <s
0c50: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63  ys/types.h>.#inc
0c60: 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68  lude <sys/stat.h
0c70: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74  >.#include <fcnt
0c80: 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  l.h>.#include <u
0c90: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
0ca0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c  e <time.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  .#include <errno
0cd0: 2e 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .h>.#if !defined
0ce0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
0cf0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
0d00: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 69 6e 63  MMAP_SIZE>0.#inc
0d10: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0d20: 3e 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53  >.#endif...#if S
0d30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0d40: 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63  KING_STYLE.# inc
0d50: 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e  lude <sys/ioctl.
0d60: 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52  h>.# if OS_VXWOR
0d70: 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  KS.#  include <s
0d80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69  emaphore.h>.#  i
0d90: 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68  nclude <limits.h
0da0: 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c  >.# else.#  incl
0db0: 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e  ude <sys/file.h>
0dc0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  .#  include <sys
0dd0: 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64 69  /param.h>.# endi
0de0: 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  f.#endif /* SQLI
0df0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0e00: 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
0e10: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
0e20: 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e  _) || (SQLITE_EN
0e30: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
0e40: 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
0e50: 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  S).# include <sy
0e60: 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69  s/mount.h>.#endi
0e70: 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55  f..#ifdef HAVE_U
0e80: 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c  TIME.# include <
0e90: 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a  utime.h>.#endif.
0ea0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
0eb0: 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c  alues of unixFil
0ec0: 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65  e.fsFlags.*/.#de
0ed0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c  fine SQLITE_FSFL
0ee0: 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20  AGS_IS_MSDOS    
0ef0: 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   0x1../*.** If w
0f00: 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72 65  e are to be thre
0f10: 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65  ad-safe, include
0f20: 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68 65   the pthreads he
0f30: 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a  ader and define.
0f40: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e  ** the SQLITE_UN
0f50: 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f  IX_THREADS macro
0f60: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
0f70: 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63  THREADSAFE.# inc
0f80: 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e  lude <pthread.h>
0f90: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
0fa0: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a  _UNIX_THREADS 1.
0fb0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0fc0: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
0fd0: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
0fe0: 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69  a new file.*/.#i
0ff0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  fndef SQLITE_DEF
1000: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
1010: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
1020: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
1030: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30  LE_PERMISSIONS 0
1040: 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  644.#endif../*.*
1050: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
1060: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
1070: 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64  ing auto proxy d
1080: 69 72 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ir.*/.#ifndef SQ
1090: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
10a0: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
10b0: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
10c0: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
10d0: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30  IR_PERMISSIONS 0
10e0: 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  755.#endif../*.*
10f0: 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  * Maximum suppor
1100: 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e  ted path-length.
1110: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
1120: 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a  PATHNAME 512../*
1130: 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65  .** Only set the
1140: 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68   lastErrno if th
1150: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1160: 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64  a real error and
1170: 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61   not .** a norma
1180: 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  l expected retur
1190: 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45  n code of SQLITE
11a0: 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f  _BUSY or SQLITE_
11b0: 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53  OK.*/.#define IS
11c0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20  _LOCK_ERROR(x)  
11d0: 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ((x != SQLITE_OK
11e0: 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54  ) && (x != SQLIT
11f0: 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f 72  E_BUSY))../* For
1200: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
1210: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1220: 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78 53 68  t unixShm unixSh
1230: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1240: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73   /* Connection s
1250: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1260: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1270: 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78 53  nixShmNode unixS
1280: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a  hmNode;       /*
1290: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   Shared memory i
12a0: 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65 64  nstance */.typed
12b0: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 49 6e  ef struct unixIn
12c0: 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f 64  odeInfo unixInod
12d0: 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20 69  eInfo;   /* An i
12e0: 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65 66  -node */.typedef
12f0: 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73   struct UnixUnus
1300: 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64 46  edFd UnixUnusedF
1310: 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75  d;     /* An unu
1320: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1330: 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f  tor */../*.** So
1340: 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20 61  metimes, after a
1350: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73 20   file handle is 
1360: 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74 65  closed by SQLite
1370: 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  , the file descr
1380: 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20  iptor.** cannot 
1390: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
13a0: 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65 20  ately. In these 
13b0: 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65 73  cases, instances
13c0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
13d0: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61  g.** structure a
13e0: 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  re used to store
13f0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1400: 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74 69  ptor while waiti
1410: 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70  ng for an.** opp
1420: 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74 68  ortunity to eith
1430: 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75 73  er close or reus
1440: 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  e it..*/.struct 
1450: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a 20  UnixUnusedFd {. 
1460: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
1470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1480: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
1490: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20   close */.  int 
14a0: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
14b0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
14c0: 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  his file descrip
14d0: 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 77  tor was opened w
14e0: 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  ith */.  UnixUnu
14f0: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20 20  sedFd *pNext;   
1500: 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65     /* Next unuse
1510: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1520: 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a  r on same file *
1530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
1540: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
1550: 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f  re is subclass o
1560: 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  f sqlite3_file s
1570: 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 75  pecific to the u
1580: 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65  nix.** VFS imple
1590: 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74  mentations..*/.t
15a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
15b0: 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b  ixFile unixFile;
15c0: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
15d0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f   {.  sqlite3_io_
15e0: 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
15f0: 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61  Method;  /* Alwa
1600: 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ys the first ent
1610: 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ry */.  sqlite3_
1620: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
1630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1640: 68 65 20 56 46 53 20 74 68 61 74 20 63 72 65 61  he VFS that crea
1650: 74 65 64 20 74 68 69 73 20 75 6e 69 78 46 69 6c  ted this unixFil
1660: 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
1670: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
1680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1690: 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f  fo about locks o
16a0: 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  n this inode */.
16b0: 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20    int h;        
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
16e0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
16f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1700: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
1710: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70        /* The typ
1720: 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  e of lock held o
1730: 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 75  n this fd */.  u
1740: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e  nsigned short in
1750: 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20  t ctrlFlags;    
1760: 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c     /* Behavioral
1770: 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49 4c 45   bits.  UNIXFILE
1780: 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  _* flags */.  in
1790: 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  t lastErrno;    
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72    /* The unix er
17c0: 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49 2f  rno from last I/
17d0: 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69  O error */.  voi
17e0: 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d *lockingContex
17f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1800: 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c   /* Locking styl
1810: 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  e specific state
1820: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
1830: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
1840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1850: 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78 55  -allocated UnixU
1860: 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63 6f 6e  nusedFd */.  con
1870: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20  st char *zPath; 
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
18a0: 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
18b0: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d0: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73   Shared memory s
18e0: 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69  egment informati
18f0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68  on */.  int szCh
1900: 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  unk;            
1910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1920: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e  onfigured by FCN
1930: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f  TL_CHUNK_SIZE */
1940: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1950: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e  MMAP_SIZE>0.  in
1960: 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20  t nFetchOut;    
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
1990: 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
19a0: 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c 69  h refs */.  sqli
19b0: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
19c0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
19d0: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
19e0: 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61  f mapping at pMa
19f0: 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  pRegion */.  sql
1a00: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
1a10: 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 20  izeActual;      
1a20: 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20   /* Actual size 
1a30: 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d  of mapping at pM
1a40: 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71  apRegion */.  sq
1a50: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1a60: 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20 20 20  SizeMax;        
1a70: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20    /* Configured 
1a80: 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20  FCNTL_MMAP_SIZE 
1a90: 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64 20  value */.  void 
1aa0: 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20  *pMapRegion;    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ac0: 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  * Memory mapped 
1ad0: 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66  region */.#endif
1ae0: 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
1af0: 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  __.  int sectorS
1b00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
1b20: 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 2a  ce sector size *
1b30: 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65 43 68  /.  int deviceCh
1b40: 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 20 20  aracteristics;  
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 6f          /* Preco
1b60: 6d 70 75 74 65 64 20 64 65 76 69 63 65 20 63 68  mputed device ch
1b70: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
1b80: 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6f 70  .#endif.  int op
1b90: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bb0: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1bc0: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1bd0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
1be0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1bf0: 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41  E || defined(__A
1c00: 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69 67 6e  PPLE__).  unsign
1c10: 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20 20 20  ed fsFlags;     
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c30: 20 63 61 63 68 65 64 20 64 65 74 61 69 6c 73 20   cached details 
1c40: 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20 2a 2f  from statfs() */
1c50: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
1c60: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
1c70: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
1c80: 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Id;          /* 
1c90: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a  Unique file ID *
1ca0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
1cb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1cc0: 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
1cd0: 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61 72   of variables ar
1ce0: 65 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20  e used to track 
1cf0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1d00: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
1d10: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62  ion counter in b
1d20: 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61  ytes 24-27 of da
1d30: 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65  tabase files are
1d40: 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68   updated.  ** wh
1d50: 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74 20  enever any part 
1d60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d70: 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73  changes.  An ass
1d80: 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c  ertion fault wil
1d90: 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20  l.  ** occur if 
1da0: 61 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  a file is update
1db0: 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75  d without also u
1dc0: 70 64 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e  pdating the tran
1dd0: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
1de0: 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73 74  nter.  This test
1df0: 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69   is made to avoi
1e00: 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73  d new problems s
1e10: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20  imilar to the.  
1e20: 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64  ** one described
1e30: 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38 34   by ticket #3584
1e40: 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  . .  */.  unsign
1e50: 65 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74  ed char transCnt
1e60: 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65  rChng;   /* True
1e70: 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
1e80: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion counter chan
1e90: 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ged */.  unsigne
1ea0: 64 20 63 68 61 72 20 64 62 55 70 64 61 74 65 3b  d char dbUpdate;
1eb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ec0: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64  if any part of d
1ed0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
1ee0: 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nged */.  unsign
1ef0: 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c  ed char inNormal
1f00: 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65  Write;   /* True
1f10: 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20   if in a normal 
1f20: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
1f30: 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  */..#endif..#ifd
1f40: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1f50: 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65   /* In test mode
1f60: 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  , increase the s
1f70: 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  ize of this stru
1f80: 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20 74  cture a bit so t
1f90: 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  hat .  ** it is 
1fa0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1fb0: 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c 65  struct CrashFile
1fc0: 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74   defined in test
1fd0: 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72  6.c..  */.  char
1fe0: 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23   aPadding[32];.#
1ff0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54 68 69  endif.};../* Thi
2000: 73 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  s variable holds
2010: 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20   the process id 
2020: 28 70 69 64 29 20 66 72 6f 6d 20 77 68 65 6e 20  (pid) from when 
2030: 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 28  the xRandomness(
2040: 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 77 61 73 20  ).** method was 
2050: 63 61 6c 6c 65 64 2e 20 20 49 66 20 78 4f 70 65  called.  If xOpe
2060: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72  n() is called fr
2070: 6f 6d 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  om a different p
2080: 72 6f 63 65 73 73 20 69 64 2c 0a 2a 2a 20 69 6e  rocess id,.** in
2090: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 20  dicating that a 
20a0: 66 6f 72 6b 28 29 20 68 61 73 20 6f 63 63 75 72  fork() has occur
20b0: 72 65 64 2c 20 74 68 65 20 50 52 4e 47 20 77 69  red, the PRNG wi
20c0: 6c 6c 20 62 65 20 72 65 73 65 74 2e 0a 2a 2f 0a  ll be reset..*/.
20d0: 73 74 61 74 69 63 20 69 6e 74 20 72 61 6e 64 6f  static int rando
20e0: 6d 6e 65 73 73 50 69 64 20 3d 20 30 3b 0a 0a 2f  mnessPid = 0;../
20f0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
2100: 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e 69 78  ues for the unix
2110: 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 20 62  File.ctrlFlags b
2120: 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69  itmask:.*/.#defi
2130: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  ne UNIXFILE_EXCL
2140: 20 20 20 20 20 20 20 20 30 78 30 31 20 20 20 20          0x01    
2150: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20   /* Connections 
2160: 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73  from one process
2170: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
2180: 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
2190: 20 20 20 20 20 20 30 78 30 32 20 20 20 20 20 2f        0x02     /
21a0: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * Connection is 
21b0: 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  read only */.#de
21c0: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 45  fine UNIXFILE_PE
21d0: 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34 20 20  RSIST_WAL 0x04  
21e0: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
21f0: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66   WAL mode */.#if
2200: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
2210: 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20 64 65  BLE_DIRSYNC.# de
2220: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
2230: 52 53 59 4e 43 20 20 20 20 30 78 30 38 20 20 20  RSYNC    0x08   
2240: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 73    /* Directory s
2250: 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ync needed */.#e
2260: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  lse.# define UNI
2270: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
2280: 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23 64 65   0x00.#endif.#de
2290: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 53  fine UNIXFILE_PS
22a0: 4f 57 20 20 20 20 20 20 20 20 30 78 31 30 20 20  OW        0x10  
22b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
22c0: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
22d0: 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e  RWRITE */.#defin
22e0: 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  e UNIXFILE_DELET
22f0: 45 20 20 20 20 20 20 30 78 32 30 20 20 20 20 20  E      0x20     
2300: 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f  /* Delete on clo
2310: 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  se */.#define UN
2320: 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20 20 20  IXFILE_URI      
2330: 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a 20 46     0x40     /* F
2340: 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20 68 61  ilename might ha
2350: 76 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ve query paramet
2360: 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ers */.#define U
2370: 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20  NIXFILE_NOLOCK  
2380: 20 20 20 20 30 78 38 30 20 20 20 20 20 2f 2a 20      0x80     /* 
2390: 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  Do no file locki
23a0: 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng */.#define UN
23b0: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 20 20 20  IXFILE_WARNED   
23c0: 20 30 78 30 31 30 30 20 20 20 20 20 2f 2a 20 76   0x0100     /* v
23d0: 65 72 69 66 79 44 62 46 69 6c 65 28 29 20 68 61  erifyDbFile() ha
23e0: 73 20 69 73 73 75 65 64 20 77 61 72 6e 69 6e 67  s issued warning
23f0: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  s */.#define UNI
2400: 58 46 49 4c 45 5f 44 45 46 45 52 52 45 44 20 20  XFILE_DEFERRED  
2410: 30 78 30 32 30 30 20 20 20 20 20 2f 2a 20 46 69  0x0200     /* Fi
2420: 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
2430: 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 2f  een opened */../
2440: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
2450: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
2460: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
2470: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
2480: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
2490: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
24a0: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
24b0: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
24c0: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
24d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
24e0: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
24f0: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2500: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2510: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
2520: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
2530: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
2540: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2550: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
2560: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
2570: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
2580: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
2590: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
25a0: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
25b0: 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64  .** The threadid
25c0: 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20   macro resolves 
25d0: 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  to the thread-id
25e0: 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20   or to 0.  Used 
25f0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
2600: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
2610: 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
2620: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66  _THREADSAFE.#def
2630: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
2640: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
2650: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
2660: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id 0.#endif../*.
2670: 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 64  ** HAVE_MREMAP d
2680: 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75 65 20  efaults to true 
2690: 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c  on Linux and fal
26a0: 73 65 20 65 76 65 72 79 77 68 65 72 65 20 65 6c  se everywhere el
26b0: 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  se..*/.#if !defi
26c0: 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29  ned(HAVE_MREMAP)
26d0: 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  .# if defined(__
26e0: 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69  linux__) && defi
26f0: 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29  ned(_GNU_SOURCE)
2700: 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f  .#  define HAVE_
2710: 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a  MREMAP 1.# else.
2720: 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d  #  define HAVE_M
2730: 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69 66 0a  REMAP 0.# endif.
2740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
2750: 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73  fferent Unix sys
2760: 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65  tems declare ope
2770: 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74  n() in different
2780: 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65   ways.  Same use
2790: 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  .** open(const c
27a0: 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29  har*,int,mode_t)
27b0: 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70  .  Others use op
27c0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
27d0: 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20  nt,...)..** The 
27e0: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d  difference is im
27f0: 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69  portant when usi
2800: 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
2810: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  the function..**
2820: 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77  .** The safest w
2830: 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ay to deal with 
2840: 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
2850: 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69  o always use thi
2860: 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69  s wrapper.** whi
2870: 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68  ch always has th
2880: 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69  e same well-defi
2890: 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ned interface..*
28a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
28b0: 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  ixOpen(const cha
28c0: 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c  r *zFile, int fl
28d0: 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a  ags, int mode){.
28e0: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46    return open(zF
28f0: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65  ile, flags, mode
2900: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73  );.}../*.** On s
2910: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c  ome systems, cal
2920: 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77  ls to fchown() w
2930: 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65  ill trigger a me
2940: 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72  ssage in a secur
2950: 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68  ity.** log if th
2960: 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e  ey come from non
2970: 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e  -root processes.
2980: 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69    So avoid calli
2990: 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a  ng fchown() if.*
29a0: 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e  * we are not run
29b0: 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f  ning as root..*/
29c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
29d0: 78 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20  xFchown(int fd, 
29e0: 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74  uid_t uid, gid_t
29f0: 20 67 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20   gid){.  return 
2a00: 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20  geteuid() ? 0 : 
2a10: 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69  fchown(fd,uid,gi
2a20: 64 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  d);.}../* Forwar
2a30: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
2a40: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
2a50: 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
2a60: 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a  ar*, int*);../*.
2a70: 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63  ** Many system c
2a80: 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65  alls are accesse
2a90: 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65  d through pointe
2aa0: 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73  r-to-functions s
2ab0: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d  o that.** they m
2ac0: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
2ad0: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66   at runtime to f
2ae0: 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20  acilitate fault 
2af0: 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67  injection during
2b00: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
2b10: 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65  sandboxing.  The
2b20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
2b30: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73   holds the names
2b40: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a   and pointers.**
2b50: 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65   to all override
2b60: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
2b70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  s..*/.static str
2b80: 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c  uct unix_syscall
2b90: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
2ba0: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
2bb0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2bc0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
2bd0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
2be0: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
2bf0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
2c00: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
2c10: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
2c20: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
2c30: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
2c40: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
2c50: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b  yscall[] = {.  {
2c60: 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20   "open",        
2c70: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2c80: 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c  l_ptr)posixOpen,
2c90: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2ca0: 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e  osOpen      ((in
2cb0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
2cc0: 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61  ,int,int))aSysca
2cd0: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
2ce0: 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20  .  { "close",   
2cf0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2d00: 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c  scall_ptr)close,
2d10: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
2d20: 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20  ine osClose     
2d30: 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53  ((int(*)(int))aS
2d40: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
2d50: 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73  nt)..  { "access
2d60: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
2d70: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63  3_syscall_ptr)ac
2d80: 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a  cess,     0  },.
2d90: 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73  #define osAccess
2da0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
2db0: 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53  st char*,int))aS
2dc0: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
2dd0: 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64  nt)..  { "getcwd
2de0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
2df0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65  3_syscall_ptr)ge
2e00: 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a  tcwd,     0  },.
2e10: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64  #define osGetcwd
2e20: 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63      ((char*(*)(c
2e30: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
2e40: 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e  scall[3].pCurren
2e50: 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20  t)..  { "stat", 
2e60: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2e70: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61  _syscall_ptr)sta
2e80: 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  t,       0  },.#
2e90: 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20  define osStat   
2ea0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2eb0: 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73  t char*,struct s
2ec0: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34  tat*))aSyscall[4
2ed0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a  ].pCurrent)../*.
2ee0: 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d  ** The DJGPP com
2ef0: 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e  piler environmen
2f00: 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c  t looks mostly l
2f10: 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74  ike Unix, but it
2f20: 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63  .** lacks the fc
2f30: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
2f40: 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20  l.  So redefine 
2f50: 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f  fcntl() to be so
2f60: 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20  mething.** that 
2f70: 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
2f80: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
2f90: 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e  t locking does n
2fa0: 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a  ot occur under.*
2fb0: 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74  * DJGPP.  But it
2fc0: 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64   is DOS - what d
2fd0: 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a  id you expect?.*
2fe0: 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50  /.#ifdef __DJGPP
2ff0: 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20  __.  { "fstat", 
3000: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
3010: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3020: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28  #define osFstat(
3030: 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73  a,b,c)    0.#els
3040: 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61  e     .  { "fsta
3050: 74 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  t",        (sqli
3060: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3070: 66 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d  fstat,      0  }
3080: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
3090: 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  t     ((int(*)(i
30a0: 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  nt,struct stat*)
30b0: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
30c0: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20  rrent).#endif.. 
30d0: 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20   { "ftruncate", 
30e0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
30f0: 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74  all_ptr)ftruncat
3100: 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  e,  0  },.#defin
3110: 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28  e osFtruncate ((
3120: 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74  int(*)(int,off_t
3130: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
3140: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
3150: 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71  ntl",        (sq
3160: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3170: 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20  r)fcntl,      0 
3180: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63   },.#define osFc
3190: 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29  ntl     ((int(*)
31a0: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
31b0: 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65  yscall[7].pCurre
31c0: 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c  nt)..  { "read",
31d0: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
31e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65  3_syscall_ptr)re
31f0: 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a  ad,       0  },.
3200: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20  #define osRead  
3210: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3220: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
3230: 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  t))aSyscall[8].p
3240: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3250: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3260: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3270: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3280: 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20    { "pread",    
3290: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
32a0: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20  call_ptr)pread, 
32b0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
32c0: 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20  .  { "pread",   
32d0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
32e0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
32f0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3300: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
3310: 61 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ad     ((ssize_t
3320: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
3330: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ze_t,off_t))aSys
3340: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
3350: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
3360: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20  SE_PREAD64).  { 
3370: 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20  "pread64",      
3380: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3390: 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20 20 20  _ptr)pread64,   
33a0: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
33b0: 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20   "pread64",     
33c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
33d0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
33e0: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
33f0: 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34  define osPread64
3400: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
3410: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
3420: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
3430: 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [10].pCurrent)..
3440: 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20    { "write",    
3450: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3460: 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20  call_ptr)write, 
3470: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3480: 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20 20 28  ne osWrite     (
3490: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
34a0: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65  const void*,size
34b0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d  _t))aSyscall[11]
34c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
34d0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
34e0: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
34f0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3500: 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  E.  { "pwrite", 
3510: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3520: 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74  yscall_ptr)pwrit
3530: 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  e,     0  },.#el
3540: 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c  se.  { "pwrite",
3550: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3560: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3570: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
3580: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
3590: 77 72 69 74 65 20 20 20 20 28 28 73 73 69 7a 65  write    ((ssize
35a0: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
35b0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
35c0: 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20  _t))\.          
35d0: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
35e0: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
35f0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
3600: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22  E_PREAD64).  { "
3610: 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28  pwrite64",     (
3620: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3630: 70 74 72 29 70 77 72 69 74 65 36 34 2c 20 20 20  ptr)pwrite64,   
3640: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3650: 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20  "pwrite64",     
3660: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3670: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3680: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3690: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34  efine osPwrite64
36a0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
36b0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
36c0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e     aSyscall[13].
36f0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3700: 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28  fchmod",       (
3710: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3720: 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20  ptr)fchmod,     
3730: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3740: 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28  Fchmod    ((int(
3750: 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61  *)(int,mode_t))a
3760: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
3770: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3780: 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
3790: 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
37a0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
37b0: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
37c0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
37d0: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f  scall_ptr)posix_
37e0: 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c  fallocate,  0 },
37f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c  .#else.  { "fall
3800: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
3810: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3820: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3830: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
3840: 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74  efine osFallocat
3850: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
3860: 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ff_t,off_t))aSys
3870: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
3880: 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b 22  t)..  { "unlink"
3890: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
38a0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 6c  _syscall_ptr)unl
38b0: 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20 30  ink,           0
38c0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e   },.#define osUn
38d0: 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a 29  link    ((int(*)
38e0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
38f0: 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72  yscall[16].pCurr
3900: 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e 44  ent)..  { "openD
3910: 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28 73  irectory",    (s
3920: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3930: 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  tr)openDirectory
3940: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  ,      0 },.#def
3950: 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  ine osOpenDirect
3960: 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e  ory ((int(*)(con
3970: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29 61  st char*,int*))a
3980: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
3990: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64 69  rent)..  { "mkdi
39a0: 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  r",        (sqli
39b0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
39c0: 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20 20  mkdir,          
39d0: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
39e0: 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74 28  Mkdir     ((int(
39f0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 6d  *)(const char*,m
3a00: 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ode_t))aSyscall[
3a10: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  18].pCurrent).. 
3a20: 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20 20   { "rmdir",     
3a30: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3a40: 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20 20  all_ptr)rmdir,  
3a50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3a60: 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20 20  efine osRmdir   
3a70: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3a80: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
3a90: 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [19].pCurrent)..
3aa0: 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20    { "fchown",   
3ab0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3ac0: 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 46 63  call_ptr)posixFc
3ad0: 68 6f 77 6e 2c 20 20 20 20 20 30 20 7d 2c 0a 23  hown,     0 },.#
3ae0: 64 65 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20  define osFchown 
3af0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3b00: 75 69 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79  uid_t,gid_t))aSy
3b10: 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65  scall[20].pCurre
3b20: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
3b30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
3b40: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
3b50: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
3b60: 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 28   "mmap",       (
3b70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3b80: 70 74 72 29 6d 6d 61 70 2c 20 20 20 20 20 30 20  ptr)mmap,     0 
3b90: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61  },.#define osMma
3ba0: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
3bb0: 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e  d*,size_t,int,in
3bc0: 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  t,int,off_t))aSy
3bd0: 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65  scall[21].pCurre
3be0: 6e 74 29 0a 0a 20 20 7b 20 22 6d 75 6e 6d 61 70  nt)..  { "munmap
3bf0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3c00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75  3_syscall_ptr)mu
3c10: 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 30  nmap,          0
3c20: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75   },.#define osMu
3c30: 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28  nmap ((void*(*)(
3c40: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
3c50: 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72  yscall[22].pCurr
3c60: 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45 5f 4d  ent)..#if HAVE_M
3c70: 52 45 4d 41 50 0a 20 20 7b 20 22 6d 72 65 6d 61  REMAP.  { "mrema
3c80: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
3c90: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
3ca0: 72 65 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  remap,          
3cb0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3cc0: 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28  mremap",       (
3cd0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3ce0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3cf0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3d00: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72 65 6d 61  .#define osMrema
3d10: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
3d20: 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a 65 5f 74  d*,size_t,size_t
3d30: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
3d40: 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[23].pCurrent)
3d50: 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20 2f 2a 20 45  .#endif..}; /* E
3d60: 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69  nd of the overri
3d70: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
3d80: 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  lls */../*.** Th
3d90: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
3da0: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
3db0: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
3dc0: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
3dd0: 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e  ** "unix" VFSes.
3de0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
3df0: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
3e00: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
3e10: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
3e20: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
3e30: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
3e40: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
3e50: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
3e60: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
3e70: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
3e80: 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d  nt unixSetSystem
3e90: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
3ea0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
3eb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
3ec0: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
3ed0: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
3ee0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
3ef0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3f00: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
3f10: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
3f20: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3f30: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
3f40: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
3f50: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
3f60: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
3f70: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
3f80: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
3f90: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
3fa0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
3fb0: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
3fc0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
3fd0: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
3fe0: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
3ff0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
4000: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
4010: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
4020: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
4030: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
4040: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
4050: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
4060: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
4070: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
4080: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
4090: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
40a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
40b0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
40c0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
40d0: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
40e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
40f0: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
4100: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
4110: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
4120: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
4130: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
4140: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
4150: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4160: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
4170: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4180: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4190: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
41a0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
41b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
41c0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
41d0: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
41e0: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
41f0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
4200: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4210: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
4220: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
4230: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
4240: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
4250: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
4260: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4270: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
4280: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
4290: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
42a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
42b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
42c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
42d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
42e0: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
42f0: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
4300: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
4310: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
4320: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
4330: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
4340: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
4350: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
4360: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
4370: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
4380: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
4390: 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53  all_ptr unixGetS
43a0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
43b0: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
43c0: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
43d0: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
43e0: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
43f0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
4400: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
4410: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
4420: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
4430: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
4440: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
4450: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
4460: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
4470: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
4480: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
4490: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
44a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
44b0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
44c0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
44d0: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
44e0: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
44f0: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
4500: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
4510: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
4520: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
4530: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
4540: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
4550: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
4560: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
4570: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
4580: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
4590: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
45a0: 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
45b0: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
45c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
45d0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
45e0: 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  -1;..  UNUSED_PA
45f0: 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66  RAMETER(p);.  if
4600: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66  ( zName ){.    f
4610: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
4620: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b  ize(aSyscall)-1;
4630: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4640: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
4650: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4660: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
4670: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b    }.  }.  for(i+
4680: 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  +; i<ArraySize(a
4690: 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a  Syscall); i++){.
46a0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
46b0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20  [i].pCurrent!=0 
46c0: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
46d0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  l[i].zName;.  }.
46e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
46f0: 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65  *.** Do not acce
4700: 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73 63  pt any file desc
4710: 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61 6e  riptor less than
4720: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e 20   this value, in 
4730: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a  order to avoid.*
4740: 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62 61  * opening databa
4750: 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66 69  se file using fi
4760: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
4770: 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79  hat are commonly
4780: 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74   used for .** st
4790: 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 75  andard input, ou
47a0: 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e  tput, and error.
47b0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
47c0: 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f  TE_MINIMUM_FILE_
47d0: 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65 66  DESCRIPTOR.# def
47e0: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  ine SQLITE_MINIM
47f0: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
4800: 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OR 3.#endif../*.
4810: 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29  ** Invoke open()
4820: 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c  .  Do so multipl
4830: 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69  e times, until i
4840: 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64  t either succeed
4850: 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f  s or.** fails fo
4860: 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74  r some reason ot
4870: 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a  her than EINTR..
4880: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
4890: 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20  e creation mode 
48a0: 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73 65  "m" is 0 then se
48b0: 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61  t it to the defa
48c0: 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74  ult for.** SQLit
48d0: 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  e.  The default 
48e0: 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  is SQLITE_DEFAUL
48f0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
4900: 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  NS (normally.** 
4910: 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69 65  0644) as modifie
4920: 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d 20  d by the system 
4930: 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73 20  umask.  If m is 
4940: 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d  not 0, then.** m
4950: 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72 65  ake the file cre
4960: 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78  ation mode be ex
4970: 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67  actly m ignoring
4980: 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a   the umask..**.*
4990: 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74 65  * The m paramete
49a0: 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65  r will be non-ze
49b0: 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65  ro only when cre
49c0: 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75  ating -wal, -jou
49d0: 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68  rnal,.** and -sh
49e0: 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61 6e  m files.  We wan
49f0: 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74 6f  t those files to
4a00: 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a 20   have *exactly* 
4a10: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d  the same.** perm
4a20: 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69 72  issions as their
4a30: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
4a40: 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74 65  se, unadulterate
4a50: 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a  d by the umask..
4a60: 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  ** In that way, 
4a70: 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  if a database fi
4a80: 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77 20  le is -rw-rw-rw 
4a90: 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e  or -rw-rw-r-, an
4aa0: 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  d a.** transacti
4ab0: 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20 6c  on crashes and l
4ac0: 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f 74  eaves behind hot
4ad0: 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
4ae0: 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74  any.** process t
4af0: 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20 77  hat is able to w
4b00: 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61  rite to the data
4b10: 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62  base will also b
4b20: 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63  e able to.** rec
4b30: 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f 75  over the hot jou
4b40: 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnals..*/.static
4b50: 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e   int robust_open
4b60: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
4b70: 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29  int f, mode_t m)
4b80: 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f  {.  int fd;.  mo
4b90: 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20  de_t m2 = m ? m 
4ba0: 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  : SQLITE_DEFAULT
4bb0: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
4bc0: 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 23  S;.  while(1){.#
4bd0: 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f  if defined(O_CLO
4be0: 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20 6f  EXEC).    fd = o
4bf0: 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45  sOpen(z,f|O_CLOE
4c00: 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20  XEC,m2);.#else. 
4c10: 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a     fd = osOpen(z
4c20: 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20  ,f,m2);.#endif. 
4c30: 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
4c40: 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d       if( errno==
4c50: 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75 65  EINTR ) continue
4c60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4c70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3e     }.    if( fd>
4c80: 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f  =SQLITE_MINIMUM_
4c90: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20  FILE_DESCRIPTOR 
4ca0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43  ) break;.    osC
4cb0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73 71  lose(fd);.    sq
4cc0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
4cd0: 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20  _WARNING, .     
4ce0: 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74 65             "atte
4cf0: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73  mpt to open \"%s
4d00: 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63 72  \" as file descr
4d10: 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64  iptor %d", z, fd
4d20: 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a  );.    fd = -1;.
4d30: 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28 22      if( osOpen("
4d40: 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d  /dev/null", f, m
4d50: 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  )<0 ) break;.  }
4d60: 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a  .  if( fd>=0 ){.
4d70: 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a      if( m!=0 ){.
4d80: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
4d90: 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20 20  t statbuf;.     
4da0: 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64 2c   if( osFstat(fd,
4db0: 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a 20   &statbuf)==0 . 
4dc0: 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75 66        && statbuf
4dd0: 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20  .st_size==0.    
4de0: 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e 73     && (statbuf.s
4df0: 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d 20  t_mode&0777)!=m 
4e00: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
4e10: 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d    osFchmod(fd, m
4e20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4e30: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44 5f  .#if defined(FD_
4e40: 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64 65  CLOEXEC) && (!de
4e50: 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29  fined(O_CLOEXEC)
4e60: 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30   || O_CLOEXEC==0
4e70: 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64  ).    osFcntl(fd
4e80: 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e  , F_SETFD, osFcn
4e90: 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20  tl(fd, F_GETFD, 
4ea0: 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29  0) | FD_CLOEXEC)
4eb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
4ec0: 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a  eturn fd;.}../*.
4ed0: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
4ee0: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
4ef0: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
4f00: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
4f10: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
4f20: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
4f30: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
4f40: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
4f50: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
4f60: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
4f70: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
4f80: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
4f90: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
4fa0: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
4fb0: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
4fc0: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
4fd0: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
4fe0: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
4ff0: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
5000: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
5010: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5020: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
5030: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
5040: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
5050: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
5060: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
5070: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
5080: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
5090: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
50a0: 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ve().*/.static v
50b0: 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  oid unixEnterMut
50c0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
50d0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
50e0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
50f0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
5100: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
5110: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
5120: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  ixLeaveMutex(voi
5130: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
5140: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
5150: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
5160: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
5170: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
5180: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5190: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
51a0: 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
51b0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
51c0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
51d0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
51e0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
51f0: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
5200: 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69  endif...#if defi
5210: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
5220: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5230: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
5240: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
5250: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74  for printing out
5260: 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69   trace informati
5270: 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e  on from debuggin
5280: 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54  g.** binaries. T
5290: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
52a0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61  string represeta
52b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
52c0: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
52d0: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
52e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
52f0: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
5300: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
5310: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
5320: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
5330: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
5340: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
5350: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
5360: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
5370: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
5380: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
5390: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
53a0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
53b0: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
53c0: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
53d0: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
53e0: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
53f0: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
5400: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
5410: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
5420: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
5430: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
5440: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
5450: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
5460: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5470: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
5480: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
5490: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
54a0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
54b0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
54c0: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
54d0: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
54e0: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
54f0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
5500: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
5510: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
5520: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
5530: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
5540: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
5550: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
5560: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
5570: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
5580: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
5590: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
55a0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
55b0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
55c0: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
55d0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
55e0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
55f0: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
5600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
5610: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
5620: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
5630: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
5640: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
5650: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
5660: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
5670: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
5680: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
5690: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
56a0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
56b0: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
56c0: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
56d0: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
56e0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
56f0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
5700: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
5710: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
5720: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
5730: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
5740: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
5750: 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e  T );.  s = osFcn
5760: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
5770: 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72   savedErrno = er
5780: 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rno;.  sqlite3De
5790: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
57a0: 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20   %d %d %s %s %d 
57b0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
57c0: 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20    threadid, fd, 
57d0: 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20  zOpName, zType, 
57e0: 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c  (int)p->l_start,
57f0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a   (int)p->l_len,.
5800: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70       (int)p->l_p
5810: 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d  id, s);.  if( s=
5820: 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53  =(-1) && op==F_S
5830: 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79  ETLK && (p->l_ty
5840: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70  pe==F_RDLCK || p
5850: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
5860: 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  K) ){.    struct
5870: 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c   flock l2;.    l
5880: 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63  2 = *p;.    osFc
5890: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
58a0: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
58b0: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
58c0: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
58d0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
58e0: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
58f0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
5900: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
5910: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
5920: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
5930: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
5940: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
5950: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5960: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
5970: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5980: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
5990: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
59a0: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
59b0: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
59c0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
59d0: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
59e0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
59f0: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
5a00: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
5a10: 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66  turn s;.}.#undef
5a20: 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65   osFcntl.#define
5a30: 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61   osFcntl lockTra
5a40: 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ce.#endif /* SQL
5a50: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a  ITE_LOCK_TRACE *
5a60: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  /../*.** Retry f
5a70: 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73  truncate() calls
5a80: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
5a90: 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69  o EINTR.*/.stati
5aa0: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72  c int robust_ftr
5ab0: 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71  uncate(int h, sq
5ac0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b  lite3_int64 sz){
5ad0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
5ae0: 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74   rc = osFtruncat
5af0: 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28  e(h,sz); }while(
5b00: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
5b10: 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
5b20: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
5b30: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e  his routine tran
5b40: 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  slates a standar
5b50: 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f  d POSIX errno co
5b60: 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e  de into somethin
5b70: 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74  g.** useful to t
5b80: 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68  he clients of th
5b90: 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69  e sqlite3 functi
5ba0: 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ons.  Specifical
5bb0: 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74  ly, it is.** int
5bc0: 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61  ended to transla
5bd0: 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  te a variety of 
5be0: 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f  "try again" erro
5bf0: 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42  rs into SQLITE_B
5c00: 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72  USY.** and a var
5c10: 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20  iety of "please 
5c20: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
5c30: 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65  escriptor NOW" e
5c40: 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53  rrors into .** S
5c50: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a  QLITE_IOERR.** .
5c60: 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67  ** Errors during
5c70: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
5c80: 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c  of locks, or fil
5c90: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
5ca0: 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73   for locks,.** s
5cb0: 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f  hould handle ENO
5cc0: 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f  LCK, ENOTSUP, EO
5cd0: 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74  PNOTSUPP separat
5ce0: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
5cf0: 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72  nt sqliteErrorFr
5d00: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  omPosixError(int
5d10: 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74   posixError, int
5d20: 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a   sqliteIOErr) {.
5d30: 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45    switch (posixE
5d40: 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20  rror) {.#if 0.  
5d50: 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  /* At one point 
5d60: 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f  this code was no
5d70: 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e  t commented out.
5d80: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73   In theory, this
5d90: 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f   branch.  ** sho
5da0: 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69 74  uld never be hit
5db0: 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  , as this functi
5dc0: 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  on should only b
5dd0: 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20  e called after. 
5de0: 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65   ** a locking-re
5df0: 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28  lated function (
5e00: 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61  i.e. fcntl()) ha
5e10: 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a  s returned non-z
5e20: 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  ero with.  ** th
5e30: 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f  e value of errno
5e40: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
5e50: 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20  gument. Since a 
5e60: 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20  system call has 
5e70: 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72  failed,.  ** err
5e80: 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e  no should be non
5e90: 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  -zero..  **.  **
5ea0: 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20 69   Despite this, i
5eb0: 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69  f errno really i
5ec0: 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c  s zero, we still
5ed0: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
5ee0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
5ef0: 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d  E_OK. The system
5f00: 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e   call failed, an
5f10: 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20  d *some* SQLite 
5f20: 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a  error should be.
5f30: 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20    ** propagated 
5f40: 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c  back to the call
5f50: 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74  er. Commenting t
5f60: 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d  his branch out m
5f70: 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20  eans errno==0.  
5f80: 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c  ** will be handl
5f90: 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61 75  ed by the "defau
5fa0: 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e  lt:" case below.
5fb0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20  .  */.  case 0: 
5fc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5fd0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20  TE_OK;.#endif.. 
5fe0: 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20   case EAGAIN:.  
5ff0: 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a  case ETIMEDOUT:.
6000: 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20    case EBUSY:.  
6010: 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61  case EINTR:.  ca
6020: 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20  se ENOLCK:  .   
6030: 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72   /* random NFS r
6040: 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65  etry error, unle
6050: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
6060: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
6070: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
6080: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
6090: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
60a0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
60b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
60c0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63  E_BUSY;.    .  c
60d0: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20  ase EACCES: .   
60e0: 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69   /* EACCES is li
60f0: 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67  ke EAGAIN during
6100: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
6110: 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  ons, but not any
6120: 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20   other time*/.  
6130: 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45    if( (sqliteIOE
6140: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
6150: 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  RR_LOCK) || .   
6160: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6170: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6180: 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20  R_UNLOCK) || .  
6190: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
61a0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
61b0: 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20  RR_RDLOCK) ||.  
61c0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
61d0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
61e0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
61f0: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  LOCK) ){.      r
6200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
6210: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  Y;.    }.    /* 
6220: 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  else fall throug
6230: 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52  h */.  case EPER
6240: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
6250: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
6260: 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73  .  /* EDEADLK is
6270: 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
6280: 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74  f a call to fcnt
6290: 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d  l(F_SETLKW) is m
62a0: 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68  ade. And.  ** th
62b0: 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20  is module never 
62c0: 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61 6c  makes such a cal
62d0: 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65 20  l. And the code 
62e0: 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c 66  in SQLite itself
62f0: 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20 74   .  ** asserts t
6300: 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  hat SQLITE_IOERR
6310: 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76 65  _BLOCKED is neve
6320: 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72 20  r returned. For 
6330: 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20 20  these reasons.  
6340: 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73 20  ** this case is 
6350: 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f  also commented o
6360: 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74 65  ut. If the syste
6370: 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e 6f  m does set errno
6380: 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a   to EDEADLK,.  *
6390: 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53 51  * the default SQ
63a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 63  LITE_IOERR_XXX c
63b0: 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ode will be retu
63c0: 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  rned. */.#if 0. 
63d0: 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20   case EDEADLK:. 
63e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
63f0: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a  _IOERR_BLOCKED;.
6400: 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 20  #endif.    .#if 
6410: 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54  EOPNOTSUPP!=ENOT
6420: 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f  SUP.  case EOPNO
6430: 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73  TSUPP: .    /* s
6440: 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65  omething went te
6450: 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c  rribly awry, unl
6460: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
6470: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
6480: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
6490: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
64a0: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
64b0: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
64c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45  .#endif.#ifdef E
64d0: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e  NOTSUP.  case EN
64e0: 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69  OTSUP: .    /* i
64f0: 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73  nvalid fd, unles
6500: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
6510: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74  stem support int
6520: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
6530: 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20  hich .     * it 
6540: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
6550: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23  hat it says */.#
6560: 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f  endif.  case EIO
6570: 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a  :.  case EBADF:.
6580: 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20    case EINVAL:. 
6590: 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a   case ENOTCONN:.
65a0: 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20    case ENODEV:. 
65b0: 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63   case ENXIO:.  c
65c0: 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64  ase ENOENT:.#ifd
65d0: 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20 20  ef ESTALE       
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
65f0: 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20 64   ESTALE is not d
6600: 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69  efined on Interi
6610: 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63  x systems */.  c
6620: 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64  ase ESTALE:.#end
6630: 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53  if.  case ENOSYS
6640: 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73  :.    /* these s
6650: 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20  hould force the 
6660: 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20  client to close 
6670: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63  the file and rec
6680: 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20  onnect */.    . 
6690: 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72   default: .    r
66a0: 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72  eturn sqliteIOEr
66b0: 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  r;.  }.}.../****
66c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
6710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
6720: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
6730: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
6740: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
6750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
6760: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
6770: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
6780: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
6790: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
67a0: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
67b0: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
67c0: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
67d0: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
67e0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
67f0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
6800: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
6810: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
6820: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
6830: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
6840: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
6850: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
6860: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
6870: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
6880: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
6890: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
68a0: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
68b0: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
68c0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
68d0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
68e0: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
68f0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
6900: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
6910: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
6920: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
6930: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
6940: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
6950: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
6960: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
6970: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
6980: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
6990: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
69a0: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
69b0: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
69c0: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
69d0: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
69e0: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
69f0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
6a00: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
6a10: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
6a20: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
6a30: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
6a40: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6a50: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
6a60: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
6a70: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
6a80: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
6a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6aa0: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
6ab0: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
6ac0: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
6af0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
6b00: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
6b10: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
6b20: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
6b30: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
6b40: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
6b50: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
6b60: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
6b70: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
6b80: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
6b90: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
6ba0: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
6bb0: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
6bc0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
6bd0: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
6be0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
6bf0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
6c00: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
6c10: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
6c20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
6c30: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
6c40: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
6c50: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
6c60: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
6c70: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
6c80: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
6c90: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
6ca0: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
6cb0: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
6cc0: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
6cd0: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
6ce0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
6cf0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
6d00: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
6d10: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
6d20: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
6d30: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
6d40: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
6d50: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
6d60: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
6d70: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
6d80: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
6d90: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
6da0: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
6db0: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
6dc0: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
6dd0: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
6de0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
6df0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
6e00: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
6e10: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6e20: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
6e30: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
6e40: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
6e50: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
6e60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6e80: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
6e90: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
6ea0: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
6eb0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
6ec0: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
6ed0: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
6ee0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
6ef0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
6f00: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
6f10: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6f20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6f30: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
6f40: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
6f50: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
6f60: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
6f70: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
6f80: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
6f90: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
6fa0: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
6fb0: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
6fc0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
6fd0: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
6fe0: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
6ff0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
7000: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
7010: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
7020: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
7030: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
7040: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
7050: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
7060: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
7070: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
7080: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
7090: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
70a0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
70b0: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
70c0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
70d0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
70e0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
70f0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
7100: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
7110: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
7120: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
7130: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
7140: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
7150: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
7160: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
7170: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
7180: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7190: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
71a0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
71b0: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
71c0: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
71d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
71f0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
7200: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
7210: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
7220: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
7230: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
7240: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
7250: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
7260: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
7270: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
7280: 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66   + (n+1) );.  if
7290: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
72a0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43  rn 0;.  pNew->zC
72b0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28  anonicalName = (
72c0: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
72d0: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
72e0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a  CanonicalName, z
72f0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b  AbsoluteName, n+
7300: 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b  1);.  n = vxwork
7310: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e  sSimplifyName(pN
7320: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7330: 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65  me, n);..  /* Se
7340: 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
7350: 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20  ting entry that 
7360: 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e  matching the can
7370: 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a  onical name..  *
7380: 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72  * If found, incr
7390: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
73a0: 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65  nce count and re
73b0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
73c0: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74  o.  ** the exist
73d0: 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a  ing file ID..  *
73e0: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
73f0: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e  ex();.  for(pCan
7400: 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69  didate=vxworksFi
7410: 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61  leList; pCandida
7420: 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70  te; pCandidate=p
7430: 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74  Candidate->pNext
7440: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64  ){.    if( pCand
7450: 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20  idate->nName==n 
7460: 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28  .     && memcmp(
7470: 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e  pCandidate->zCan
7480: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77  onicalName, pNew
7490: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
74a0: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  , n)==0.    ){. 
74b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
74c0: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
74d0: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65   pCandidate->nRe
74e0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78  f++;.       unix
74f0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
7500: 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e       return pCan
7510: 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  didate;.    }.  
7520: 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68  }..  /* No match
7530: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20   was found.  We 
7540: 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20  will make a new 
7550: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65  file ID */.  pNe
7560: 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  w->nRef = 1;.  p
7570: 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a  New->nName = n;.
7580: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
7590: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
75a0: 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  .  vxworksFileLi
75b0: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69  st = pNew;.  uni
75c0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
75d0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
75e0: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
75f0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
7600: 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b  ount on a vxwork
7610: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
7620: 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a   Free.** the obj
7630: 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66  ect when the ref
7640: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
7650: 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  ches zero..*/.st
7660: 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b  atic void vxwork
7670: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73  sReleaseFileId(s
7680: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
7690: 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69  eId *pId){.  uni
76a0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
76b0: 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52   assert( pId->nR
76c0: 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e  ef>0 );.  pId->n
76d0: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64  Ref--;.  if( pId
76e0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
76f0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
7700: 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20  ileId **pp;.    
7710: 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46  for(pp=&vxworksF
7720: 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20  ileList; *pp && 
7730: 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26  *pp!=pId; pp = &
7740: 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b  ((*pp)->pNext)){
7750: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  }.    assert( *p
7760: 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70  p==pId );.    *p
7770: 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a  p = pId->pNext;.
7780: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7790: 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  (pId);.  }.  uni
77a0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
77b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
77c0: 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  WORKS */./******
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
77e0: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
77f0: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
7800: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
7810: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
7820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7860: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
7870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
78a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
78b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
78c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
78d0: 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76  ****** Posix Adv
78e0: 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  isory Locking **
78f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
7910: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
7920: 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e  locks are broken
7930: 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53   by design.  ANS
7940: 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39  I STD 1003.1 (19
7950: 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36  96).** section 6
7960: 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33  .5.2.2 lines 483
7970: 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65   through 490 spe
7980: 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61  cify that when a
7990: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73   process.** sets
79a0: 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63   or clears a loc
79b0: 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f  k, that operatio
79c0: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
79d0: 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a  prior locks set.
79e0: 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ** by the same p
79f0: 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73  rocess.  It does
7a00: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
7a10: 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73  say so, but this
7a20: 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74   implies.** that
7a30: 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f   it overrides lo
7a40: 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73  cks set by the s
7a50: 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e  ame process usin
7a60: 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  g a different.**
7a70: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7a80: 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73  .  Consider this
7a90: 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a   test case:.**.*
7aa0: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20  *       int fd1 
7ab0: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22  = open("./file1"
7ac0: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
7ad0: 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20  , 0644);.**     
7ae0: 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e    int fd2 = open
7af0: 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44  ("./file2", O_RD
7b00: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
7b10: 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  );.**.** Suppose
7b20: 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66   ./file1 and ./f
7b30: 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20  ile2 are really 
7b40: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62  the same file (b
7b50: 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73  ecause.** one is
7b60: 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f   a hard or symbo
7b70: 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20  lic link to the 
7b80: 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79  other) then if y
7b90: 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63  ou set.** an exc
7ba0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66  lusive lock on f
7bb0: 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  d1, then try to 
7bc0: 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  get an exclusive
7bd0: 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c   lock.** on fd2,
7be0: 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f   it works.  I wo
7bf0: 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65  uld have expecte
7c00: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63  d the second loc
7c10: 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e  k to.** fail sin
7c20: 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72  ce there was alr
7c30: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  eady a lock on t
7c40: 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66  he file due to f
7c50: 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73  d1..** But not s
7c60: 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c  o.  Since both l
7c70: 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74  ocks came from t
7c80: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c  he same process,
7c90: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f   the.** second o
7ca0: 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72  verrides the fir
7cb0: 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  st, even though 
7cc0: 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66  they were on dif
7cd0: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
7ce0: 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
7cf0: 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66  d on different f
7d00: 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a  ile names..**.**
7d10: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
7d20: 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50   we cannot use P
7d30: 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79  OSIX locks to sy
7d40: 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61  nchronize file a
7d50: 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63  ccess.** among c
7d60: 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73  ompeting threads
7d70: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f   of the same pro
7d80: 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63  cess.  POSIX loc
7d90: 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ks will work fin
7da0: 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e  e.** to synchron
7db0: 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74  ize access for t
7dc0: 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61  hreads in separa
7dd0: 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75  te processes, bu
7de0: 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  t not.** threads
7df0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
7e00: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
7e10: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
7e20: 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69  he problem, SQLi
7e30: 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65  te has to manage
7e40: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65   file locks inte
7e50: 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73  rnally.** on its
7e60: 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20   own.  Whenever 
7e70: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
7e80: 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76  s opened, we hav
7e90: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  e to find the.**
7ea0: 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20   specific inode 
7eb0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7ec0: 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20  file (the inode 
7ed0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
7ee0: 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61   the.** st_dev a
7ef0: 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73  nd st_ino fields
7f00: 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72   of the stat str
7f10: 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61  ucture that fsta
7f20: 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a  t() fills in).**
7f30: 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c   and check for l
7f40: 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69  ocks already exi
7f50: 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e  sting on that in
7f60: 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73  ode.  When locks
7f70: 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   are.** created 
7f80: 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68  or removed, we h
7f90: 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f  ave to look at o
7fa0: 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20  ur own internal 
7fb0: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a  record of the.**
7fc0: 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66   locks to see if
7fd0: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
7fe0: 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  has previously s
7ff0: 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61  et a lock on tha
8000: 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e  t same.** inode.
8010: 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54  .**.** (Aside: T
8020: 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20  he use of inode 
8030: 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75  numbers as uniqu
8040: 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77  e IDs does not w
8050: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
8060: 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20  ** For VxWorks, 
8070: 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74  we have to use t
8080: 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75  he alternative u
8090: 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20  nique ID system 
80a0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f  based on.** cano
80b0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61  nical filename a
80c0: 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  nd implemented i
80d0: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64  n the previous d
80e0: 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20  ivision.).**.** 
80f0: 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  The sqlite3_file
8100: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50   structure for P
8110: 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  OSIX is no longe
8120: 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65  r just an intege
8130: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
8140: 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77  ptor.  It is now
8150: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
8160: 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65  t holds the inte
8170: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
8180: 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69  riptor and a poi
8190: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74  nter to a struct
81a0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
81b0: 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  es the internal.
81c0: 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ** locks on the 
81d0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
81e0: 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ode.  There is o
81f0: 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ne locking struc
8200: 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64  ture.** per inod
8210: 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d  e, so if the sam
8220: 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65  e inode is opene
8230: 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e  d twice, both un
8240: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
8250: 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  s.** point to th
8260: 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73  e same locking s
8270: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c  tructure.  The l
8280: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
8290: 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65   keeps.** a refe
82a0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20  rence count (so 
82b0: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
82c0: 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20  n to delete it) 
82d0: 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66  and a "cnt".** f
82e0: 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20  ield that tells 
82f0: 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  us its internal 
8300: 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e  lock status.  cn
8310: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a  t==0 means the.*
8320: 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  * file is unlock
8330: 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61  ed.  cnt==-1 mea
8340: 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ns the file has 
8350: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
8360: 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e  k..** cnt>0 mean
8370: 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20  s there are cnt 
8380: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20  shared locks on 
8390: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
83a0: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  Any attempt to l
83b0: 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20  ock or unlock a 
83c0: 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b  file first check
83d0: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  s the locking.**
83e0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
83f0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
8400: 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76  call is only inv
8410: 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a  oked to set a .*
8420: 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20  * POSIX lock if 
8430: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  the internal loc
8440: 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  k structure tran
8450: 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a  sitions between.
8460: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20  ** a locked and 
8470: 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74  an unlocked stat
8480: 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69  e..**.** But wai
8490: 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65  t:  there are ye
84a0: 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20  t more problems 
84b0: 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73  with POSIX advis
84c0: 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  ory locks..**.**
84d0: 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   If you close a 
84e0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
84f0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
8500: 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c   file that has l
8510: 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63  ocks,.** all loc
8520: 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ks on that file 
8530: 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62  that are owned b
8540: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  y the current pr
8550: 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c  ocess are.** rel
8560: 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20  eased.  To work 
8570: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
8580: 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e  lem, each unixIn
8590: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  odeInfo object.*
85a0: 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f  * maintains a co
85b0: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
85c0: 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63  r of pending loc
85d0: 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e  ks on tha inode.
85e0: 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65  .** When an atte
85f0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
8600: 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65  lose an unixFile
8610: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  , if there are.*
8620: 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65  * other unixFile
8630: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
8640: 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65  e inode that are
8650: 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20   holding locks, 
8660: 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63  the call.** to c
8670: 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20  lose() the file 
8680: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65  descriptor is de
8690: 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c  ferred until all
86a0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c   of the locks cl
86b0: 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ear..** The unix
86c0: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
86d0: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
86e0: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
86f0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
8700: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
8710: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
8720: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
8730: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
8740: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
8750: 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f  s..**.** Yet ano
8760: 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c  ther problem:  L
8770: 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e  inuxThreads do n
8780: 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
8790: 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a  h posix locks..*
87a0: 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20  *.** Many older 
87b0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75  versions of linu
87c0: 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54  x use the LinuxT
87d0: 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77  hreads library w
87e0: 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70  hich is.** not p
87f0: 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20  osix compliant. 
8800: 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65   Under LinuxThre
8810: 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61  ads, a lock crea
8820: 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a  ted by thread.**
8830: 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64   A cannot be mod
8840: 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64  ified or overrid
8850: 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65  den by a differe
8860: 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  nt thread B..** 
8870: 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61  Only thread A ca
8880: 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63  n modify the loc
8890: 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61  k.  Locking beha
88a0: 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a  vior is correct.
88b0: 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61  ** if the applia
88c0: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65  tion uses the ne
88d0: 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78  wer Native Posix
88e0: 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20   Thread Library 
88f0: 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e  (NPTL).** on lin
8900: 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61  ux - with NPTL a
8910: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
8920: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
8930: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
8940: 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75  in thread B.  Bu
8950: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  t there is no wa
8960: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  y to know at com
8970: 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a  pile-time which.
8980: 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62  ** threading lib
8990: 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  rary is being us
89a0: 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ed.  So there is
89b0: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
89c0: 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  at.** compile-ti
89d0: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
89e0: 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  t thread A can o
89f0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e  verride locks on
8a00: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
8a10: 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75  e has to do a ru
8a20: 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20  n-time check to 
8a30: 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68  discover the beh
8a40: 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20  avior of the.** 
8a50: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
8a60: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73  .**.** SQLite us
8a70: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69  ed to support Li
8a80: 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74  nuxThreads.  But
8a90: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e   support for Lin
8aa0: 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73  uxThreads.** was
8ab0: 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69   dropped beginni
8ac0: 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20  ng with version 
8ad0: 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77  3.7.0.  SQLite w
8ae0: 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77  ill still work w
8af0: 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65  ith.** LinuxThre
8b00: 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61  ads provided tha
8b10: 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e  t (1) there is n
8b20: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
8b30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70  connection .** p
8b40: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
8b50: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f   in the same pro
8b60: 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74  cess and (2) dat
8b70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8b80: 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65  s.** do not move
8b90: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e   across threads.
8ba0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
8bb0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
8bc0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
8bd0: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
8be0: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
8bf0: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
8c00: 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ar unixInodeInfo
8c10: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75   object..*/.stru
8c20: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a  ct unixFileId {.
8c30: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c50: 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a   Device number *
8c60: 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
8c70: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
8c80: 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f  sFileId *pId;  /
8c90: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
8ca0: 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f   for vxworks. */
8cb0: 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69  .#else.  ino_t i
8cc0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
8cd0: 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75       /* Inode nu
8ce0: 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  mber */.#endif.}
8cf0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
8d00: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
8d10: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
8d20: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
8d30: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
8d40: 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e  ode.  Or, on Lin
8d50: 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65  uxThreads, there
8d60: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
8d70: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a   structures for.
8d80: 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70  ** each inode op
8d90: 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72  ened by each thr
8da0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ead..**.** A sin
8db0: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
8dc0: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
8dd0: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
8de0: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
8df0: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
8e00: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
8e10: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
8e20: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
8e30: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
8e40: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
8e50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
8e60: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
8e70: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
8e80: 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  t unixInodeInfo 
8e90: 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  {.  struct unixF
8ea0: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
8eb0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75      /* The looku
8ec0: 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  p key */.  int n
8ed0: 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20  Shared;         
8ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8ef0: 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c  mber of SHARED l
8f00: 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
8f10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69  nsigned char eFi
8f20: 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f  leLock;        /
8f30: 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f  * One of SHARED_
8f40: 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
8f50: 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e  OCK etc. */.  un
8f60: 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f  signed char bPro
8f70: 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a  cessLock;     /*
8f80: 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72   An exclusive pr
8f90: 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65  ocess lock is he
8fa0: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ld */.  int nRef
8fb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8fc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8fd0: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
8fe0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
8ff0: 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
9000: 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
9010: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
9020: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
9030: 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65   with this inode
9040: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b   */.  int nLock;
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9060: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9070: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66  of outstanding f
9080: 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55  ile locks */.  U
9090: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
90a0: 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  used;          /
90b0: 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65  * Unused file de
90c0: 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f  scriptors to clo
90d0: 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  se */.  unixInod
90e0: 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20  eInfo *pNext;   
90f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
9100: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
9110: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Info objects */.
9120: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9130: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
9140: 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75    /*    .... dou
9150: 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69  bly linked */.#i
9160: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9170: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
9180: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
9190: 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20  ng sharedByte;  
91a0: 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c  /* for AFP simul
91b0: 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b  ated shared lock
91c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
91d0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f  S_VXWORKS.  sem_
91e0: 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20  t *pSem;        
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9200: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
9210: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
9220: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
9230: 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d  NAME+2];  /* Nam
9240: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
9250: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ore */.#endif.};
9260: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20  ../*.** A lists 
9270: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
9280: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  Info objects..*/
9290: 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64  .static unixInod
92a0: 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74  eInfo *inodeList
92b0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   = 0;../*.**.** 
92c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
92d0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29  unixLogError_x()
92e0: 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  , is only ever c
92f0: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
9300: 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72  cro.** unixLogEr
9310: 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ror()..**.** It 
9320: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
9330: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9340: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
9350: 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73  on and errno has
9360: 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74   been.** set. It
9370: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
9380: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
9390: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
93a0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
93b0: 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64   of.** errno and
93c0: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
93d0: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
93e0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
93f0: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a  m strerror() or.
9400: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  ** strerror_r().
9410: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
9420: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
9430: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
9440: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
9450: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
9460: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
9470: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
9480: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
9490: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
94a0: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
94b0: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
94c0: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
94d0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
94e0: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
94f0: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e  at.** failed (e.
9500: 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70  g. "unlink", "op
9510: 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73 73  en") and the ass
9520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73  ociated file-sys
9530: 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20  tem path,.** if 
9540: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
9550: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62  unixLogError(a,b
9560: 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45  ,c)     unixLogE
9570: 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63  rrorAtLine(a,b,c
9580: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
9590: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72  c int unixLogErr
95a0: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
95b0: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
95d0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
95e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
95f0: 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20   *zFunc,        
9600: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
9610: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
9620: 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f  t failed */.  co
9630: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9650: 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63   File path assoc
9660: 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72  iated with error
9670: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20   */.  int iLine 
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
96a0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72  line number wher
96b0: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
96c0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
96d0: 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Err;            
96e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73           /* Mess
96f0: 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  age from strerro
9700: 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e  r() or equivalen
9710: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e  t */.  int iErrn
9720: 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20  o = errno;      
9730: 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
9740: 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75  syscall error nu
9750: 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  mber */..  /* If
9760: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
9770: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20  hreadsafe build 
9780: 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  (SQLITE_THREADSA
9790: 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65  FE==0), then use
97a0: 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72  .  ** the strerr
97b0: 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  or() function to
97c0: 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61   obtain the huma
97d0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72  n-readable error
97e0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71   message.  ** eq
97f0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e  uivalent to errn
9800: 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  o. Otherwise, us
9810: 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  e strerror_r()..
9820: 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45    */ .#if SQLITE
9830: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
9840: 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45  efined(HAVE_STRE
9850: 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61  RROR_R).  char a
9860: 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65  Err[80];.  memse
9870: 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f  t(aErr, 0, sizeo
9880: 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72  f(aErr));.  zErr
9890: 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49   = aErr;..  /* I
98a0: 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  f STRERROR_R_CHA
98b0: 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f  R_P (set by auto
98c0: 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72  conf scripts) or
98d0: 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65   __USE_GNU is de
98e0: 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75  fined,.  ** assu
98f0: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
9900: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
9910: 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  GNU version of s
9920: 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74  trerror_r() that
9930: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
9940: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
9950: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
9960: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
9970: 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a  . That pointer .
9980: 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74    ** may point t
9990: 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20  o aErr[], or it 
99a0: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  may point to som
99b0: 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65  e static storage
99c0: 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a   somewhere. .  *
99d0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73  * Otherwise, ass
99e0: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
99f0: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
9a00: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f   POSIX version o
9a10: 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72  f .  ** strerror
9a20: 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61  _r(), which alwa
9a30: 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72  ys writes an err
9a40: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20  or message into 
9a50: 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  aErr[]..  **.  *
9a60: 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e  * If the code in
9a70: 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65  correctly assume
9a80: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
9a90: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74   POSIX version t
9aa0: 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69  hat is.  ** avai
9ab0: 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72  lable, the error
9ac0: 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66   message will of
9ad0: 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20  ten be an empty 
9ae0: 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20  string. Not a.  
9af0: 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e  ** huge problem.
9b00: 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e   Incorrectly con
9b10: 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65  cluding that the
9b20: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20   GNU version is 
9b30: 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20  available .  ** 
9b40: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
9b50: 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e  segfault though.
9b60: 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
9b70: 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  d(STRERROR_R_CHA
9b80: 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  R_P) || defined(
9b90: 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72  __USE_GNU).  zEr
9ba0: 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73  r = .# endif.  s
9bb0: 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f  trerror_r(iErrno
9bc0: 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61  , aErr, sizeof(a
9bd0: 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20  Err)-1);..#elif 
9be0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
9bf0: 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  E.  /* This is a
9c00: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c   threadsafe buil
9c10: 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f  d, but strerror_
9c20: 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  r() is not avail
9c30: 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  able. */.  zErr 
9c40: 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  = "";.#else.  /*
9c50: 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20   Non-threadsafe 
9c60: 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72  build, use strer
9c70: 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72  ror(). */.  zErr
9c80: 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72   = strerror(iErr
9c90: 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  no);.#endif..  i
9ca0: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
9cb0: 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69  ath = "";.  sqli
9cc0: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
9cd0: 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e  .      "os_unix.
9ce0: 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73  c:%d: (%d) %s(%s
9cf0: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
9d00: 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46  Line, iErrno, zF
9d10: 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72  unc, zPath, zErr
9d20: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
9d30: 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errcode;.}../*.*
9d40: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  * Close a file d
9d50: 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
9d60: 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   We assume that 
9d70: 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61  close() almost a
9d80: 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e  lways works, sin
9d90: 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e  ce it is only in
9da0: 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20   a.** very sick 
9db0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f  application or o
9dc0: 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c  n a very sick pl
9dd0: 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d  atform that it m
9de0: 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66  ight fail..** If
9df0: 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73   it does fail, s
9e00: 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66  imply leak the f
9e10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
9e20: 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a  but do log the.*
9e30: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e  * error..**.** N
9e40: 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e  ote that it is n
9e50: 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79  ot safe to retry
9e60: 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45   close() after E
9e70: 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a  INTR since the.*
9e80: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
9e90: 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72  r might have alr
9ea0: 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64  eady been reused
9eb0: 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65   by another thre
9ec0: 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e  ad..** So we don
9ed0: 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72  't even try to r
9ee0: 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45  ecover from an E
9ef0: 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20  INTR.  Just log 
9f00: 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64  the error.** and
9f10: 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61   move on..*/.sta
9f20: 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f  tic void robust_
9f30: 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  close(unixFile *
9f40: 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e  pFile, int h, in
9f50: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28  t lineno){.  if(
9f60: 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20   osClose(h) ){. 
9f70: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
9f80: 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45  tLine(SQLITE_IOE
9f90: 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65  RR_CLOSE, "close
9fa0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
9fb0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20            pFile 
9fc0: 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a  ? pFile->zPath :
9fd0: 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d   0, lineno);.  }
9fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
9ff0: 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  all file descrip
a000: 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20  tors accumuated 
a010: 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  in the unixInode
a020: 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69  Info->pUnused li
a030: 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  st..*/ .static v
a040: 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67  oid closePending
a050: 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Fds(unixFile *pF
a060: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
a070: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
a080: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
a090: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
a0a0: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
a0b0: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
a0c0: 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  =pInode->pUnused
a0d0: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
a0e0: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
a0f0: 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  ext;.    robust_
a100: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e  close(pFile, p->
a110: 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
a120: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a130: 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65  p);.  }.  pInode
a140: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
a150: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
a160: 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  a unixInodeInfo 
a170: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
a180: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
a190: 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  y findInodeInfo(
a1a0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  )..**.** The mut
a1b0: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
a1c0: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
a1d0: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
a1e0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
a1f0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a200: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
a210: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
a220: 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69  aseInodeInfo(uni
a230: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
a240: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a250: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
a260: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
a270: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
a280: 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
a290: 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20  S(pInode) ){.   
a2a0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b   pInode->nRef--;
a2b0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
a2c0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
a2d0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
a2e0: 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b  ->pShmNode==0 );
a2f0: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
a300: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
a310: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
a320: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
a330: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
a340: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
a350: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
a360: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d    pInode->pPrev-
a370: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
a380: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
a390: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
a3a0: 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d  ert( inodeList==
a3b0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
a3c0: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
a3d0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
a3e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a3f0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a  Inode->pNext ){.
a400: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a410: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70  pInode->pNext->p
a420: 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Prev==pInode );.
a430: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
a440: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
a450: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20  Inode->pPrev;.  
a460: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a470: 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29  te3_free(pInode)
a480: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
a490: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
a4a0: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
a4b0: 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f  cate the unixIno
a4c0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  deInfo object th
a4d0: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
a4e0: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
a4f0: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20  ptor.  Create a 
a500: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
a510: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
a520: 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74  turn value might
a530: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
a540: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
a550: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  curs..**.** The 
a560: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
a570: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
a580: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
a590: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
a5a0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
a5b0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
a5c0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
a5d0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
a5e0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
a5f0: 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49  c int findInodeI
a600: 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  nfo(.  unixFile 
a610: 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
a620: 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69        /* Unix fi
a630: 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73  le with file des
a640: 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65  c used in the ke
a650: 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  y */.  unixInode
a660: 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20  Info **ppInode  
a670: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
a680: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
a690: 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f  o object here */
a6a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
a6d0: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
a6e0: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a700: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
a710: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
a720: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
a730: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
a740: 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b  Id;      /* Look
a750: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
a760: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a  nixInodeInfo */.
a770: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
a780: 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
a790: 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
a7a0: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
a7b0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
a7c0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20  o *pInode = 0;  
a7d0: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
a7e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
a7f0: 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ject */..  asser
a800: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
a810: 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  () );..  /* Get 
a820: 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d  low-level inform
a830: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
a840: 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e  file that we can
a850: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72   used to.  ** cr
a860: 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61  eate a unique na
a870: 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  me for the file.
a880: 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69  .  */.  fd = pFi
a890: 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73  le->h;.  rc = os
a8a0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
a8b0: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
a8c0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
a8d0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
a8e0: 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c  ;.#ifdef EOVERFL
a8f0: 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  OW.    if( pFile
a900: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
a910: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
a920: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
a930: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
a940: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
a950: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
a960: 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58  E__.  /* On OS X
a970: 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c   on an msdos fil
a980: 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f  esystem, the ino
a990: 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70  de number is rep
a9a0: 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72  orted.  ** incor
a9b0: 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d  rectly for zero-
a9c0: 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65  size files.  See
a9d0: 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20   ticket #3260.  
a9e0: 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f  To work.  ** aro
a9f0: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
aa00: 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74   (we consider it
aa10: 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20   a bug in OS X, 
aa20: 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a  not SQLite).  **
aa30: 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65   we always incre
aa40: 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ase the file siz
aa50: 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e  e to 1 by writin
aa60: 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  g a single byte.
aa70: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63    ** prior to ac
aa80: 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64  cessing the inod
aa90: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f  e number.  The o
aaa0: 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  ne byte written 
aab0: 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49  is.  ** an ASCII
aac0: 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77   'S' character w
aad0: 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e  hich also happen
aae0: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
aaf0: 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74  t byte.  ** in t
ab00: 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65  he header of eve
ab10: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
ab20: 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  se.  In this way
ab30: 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  , if there.  ** 
ab40: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
ab50: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e  ion such that an
ab60: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
ab70: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
ab80: 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  ed.  ** the firs
ab90: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
aba0: 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67  tabase, no damag
abb0: 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
abc0: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
abd0: 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69  _size==0 && (pFi
abe0: 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
abf0: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
ac00: 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20  MSDOS)!=0 ){.   
ac10: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74   do{ rc = osWrit
ac20: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d  e(fd, "S", 1); }
ac30: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
ac40: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
ac50: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
ac60: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
ac70: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
ac80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ac90: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
aca0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61  .    rc = osFsta
acb0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
acc0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
acd0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
ace0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
acf0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
ad00: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
ad10: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
ad20: 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c   memset(&fileId,
ad30: 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49   0, sizeof(fileI
ad40: 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65  d));.  fileId.de
ad50: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
ad60: 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  ev;.#if OS_VXWOR
ad70: 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20  KS.  fileId.pId 
ad80: 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65  = pFile->pId;.#e
ad90: 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f  lse.  fileId.ino
ada0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e   = statbuf.st_in
adb0: 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f  o;.#endif.  pIno
adc0: 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
add0: 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
ade0: 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49  && memcmp(&fileI
adf0: 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  d, &pInode->file
ae00: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
ae10: 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  d)) ){.    pInod
ae20: 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
ae30: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  t;.  }.  if( pIn
ae40: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49  ode==0 ){.    pI
ae50: 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  node = sqlite3_m
ae60: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
ae70: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
ae80: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
ae90: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
aea0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
aeb0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64      memset(pInod
aec0: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  e, 0, sizeof(*pI
aed0: 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63  node));.    memc
aee0: 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  py(&pInode->file
aef0: 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a  Id, &fileId, siz
af00: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
af10: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d    pInode->nRef =
af20: 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   1;.    pInode->
af30: 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73  pNext = inodeLis
af40: 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  t;.    pInode->p
af50: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66  Prev = 0;.    if
af60: 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e  ( inodeList ) in
af70: 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  odeList->pPrev =
af80: 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f   pInode;.    ino
af90: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b  deList = pInode;
afa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
afb0: 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  node->nRef++;.  
afc0: 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70  }.  *ppInode = p
afd0: 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20  Inode;.  return 
afe0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
aff0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
b000: 69 66 20 70 46 69 6c 65 20 68 61 73 20 62 65 65  if pFile has bee
b010: 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c  n renamed or unl
b020: 69 6e 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77  inked since it w
b030: 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
b040: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
b050: 69 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78  ileHasMoved(unix
b060: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
b070: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
b080: 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
b090: 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 0a 20 20  >pInode!=0 &&.  
b0a0: 20 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70         (osStat(p
b0b0: 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75  File->zPath, &bu
b0c0: 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74 5f  f)!=0 || buf.st_
b0d0: 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f  ino!=pFile->pIno
b0e0: 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b  de->fileId.ino);
b0f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
b100: 20 61 20 75 6e 69 78 46 69 6c 65 20 74 68 61 74   a unixFile that
b110: 20 69 73 20 61 20 64 61 74 61 62 61 73 65 2e 20   is a database. 
b120: 20 56 65 72 69 66 79 20 74 68 65 20 66 6f 6c 6c   Verify the foll
b130: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29  owing:.**.** (1)
b140: 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
b150: 79 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20  y one hard link 
b160: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28  on the file.** (
b170: 32 29 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  2) The file is n
b180: 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69  ot a symbolic li
b190: 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20 66 69  nk.** (3) The fi
b1a0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
b1b0: 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e  renamed or unlin
b1c0: 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20  ked.**.** Issue 
b1d0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b1e0: 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20  TE_WARNING,...) 
b1f0: 6d 65 73 73 61 67 65 73 20 69 66 20 61 6e 79 74  messages if anyt
b200: 68 69 6e 67 20 69 73 20 6e 6f 74 20 72 69 67 68  hing is not righ
b210: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
b220: 64 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 75  d verifyDbFile(u
b230: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
b240: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
b250: 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  uf;.  int rc;.  
b260: 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
b270: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
b280: 57 41 52 4e 45 44 20 29 7b 0a 20 20 20 20 2f 2a  WARNED ){.    /*
b290: 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   One or more of 
b2a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61  the following wa
b2b0: 72 6e 69 6e 67 73 20 68 61 76 65 20 61 6c 72 65  rnings have alre
b2c0: 61 64 79 20 62 65 65 6e 20 69 73 73 75 65 64 2e  ady been issued.
b2d0: 20 20 44 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20    Do not.    ** 
b2e0: 72 65 70 65 61 74 20 74 68 65 6d 20 73 6f 20 61  repeat them so a
b2f0: 73 20 6e 6f 74 20 74 6f 20 63 6c 75 74 74 65 72  s not to clutter
b300: 20 74 68 65 20 65 72 72 6f 72 20 6c 6f 67 20 2a   the error log *
b310: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
b320: 7d 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  }.  rc = osFstat
b330: 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
b340: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
b350: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
b360: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
b370: 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74 20 64   "cannot fstat d
b380: 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46 69 6c  b file %s", pFil
b390: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
b3a0: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b3b0: 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  |= UNIXFILE_WARN
b3c0: 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ED;.    return;.
b3d0: 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74    }.  if( buf.st
b3e0: 5f 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28 70 46  _nlink==0 && (pF
b3f0: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
b400: 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
b410: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
b420: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b430: 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e  ARNING, "file un
b440: 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65  linked while ope
b450: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
b460: 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65  Path);.    pFile
b470: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
b480: 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a  NIXFILE_WARNED;.
b490: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
b4a0: 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69    if( buf.st_nli
b4b0: 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  nk>1 ){.    sqli
b4c0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b4d0: 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70 6c  ARNING, "multipl
b4e0: 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65 3a  e links to file:
b4f0: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
b500: 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  th);.    pFile->
b510: 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
b520: 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20  XFILE_WARNED;.  
b530: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b540: 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76 65 64  if( fileHasMoved
b550: 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 73  (pFile) ){.    s
b560: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
b570: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65  E_WARNING, "file
b580: 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65 20 6f   renamed while o
b590: 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d  pen: %s", pFile-
b5a0: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69  >zPath);.    pFi
b5b0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
b5c0: 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44   UNIXFILE_WARNED
b5d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b5e0: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  }.}.../*.** This
b5f0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
b600: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
b610: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
b620: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
b630: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
b640: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
b650: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
b660: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
b670: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
b680: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
b690: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
b6a0: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
b6b0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
b6c0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
b6d0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
b6e0: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
b6f0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
b700: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
b710: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
b720: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
b730: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
b740: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
b750: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
b760: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
b770: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
b780: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
b790: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
b7a0: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
b7b0: 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
b7c0: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
b7d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
b7e0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
b7f0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65   );..  if( pFile
b800: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
b810: 49 58 46 49 4c 45 5f 44 45 46 45 52 52 45 44 20  IXFILE_DEFERRED 
b820: 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  ){.    *pResOut 
b830: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
b840: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
b850: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
b860: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
b870: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
b880: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
b890: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
b8a0: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
b8b0: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
b8c0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
b8d0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
b8e0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
b8f0: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
b900: 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
b910: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
b920: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
b930: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
b940: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
b950: 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47  */.#ifndef __DJG
b960: 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65  PP__.  if( !rese
b970: 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e  rved && !pFile->
b980: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
b990: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75  Lock ){.    stru
b9a0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
b9b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
b9c0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
b9d0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
b9e0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
b9f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
ba00: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
ba10: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
ba20: 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46    if( osFcntl(pF
ba30: 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  ile->h, F_GETLK,
ba40: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
ba50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
ba60: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
ba70: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
ba80: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
ba90: 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
baa0: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
bab0: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
bac0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
bad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
bae0: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
baf0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
bb00: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
bb10: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
bb20: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
bb30: 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
bb40: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
bb50: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
bb60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
bb70: 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73  tempt to set a s
bb80: 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68  ystem-lock on th
bb90: 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54  e file pFile.  T
bba0: 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64  he lock is .** d
bbb0: 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63  escribed by pLoc
bbc0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
bbd0: 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  pFile was opened
bbe0: 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d   read/write from
bbf0: 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e   unix-excl, then
bc00: 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a   the only lock.*
bc10: 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20  * ever obtained 
bc20: 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  is an exclusive 
bc30: 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20  lock, and it is 
bc40: 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79  obtained exactly
bc50: 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72   once.** the fir
bc60: 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b  st time any lock
bc70: 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20   is attempted.  
bc80: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73  All subsequent s
bc90: 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  ystem locking.**
bca0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f   operations beco
bcb0: 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b  me no-ops.  Lock
bcc0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73  ing operations s
bcd0: 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65  till happen inte
bce0: 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72  rnally,.** in or
bcf0: 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  der to coordinat
bd00: 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e  e access between
bd10: 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61   separate databa
bd20: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
bd30: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72  * within this pr
bd40: 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f  ocess, but all o
bd50: 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65  f that is handle
bd60: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20  d in memory and 
bd70: 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  the.** operating
bd80: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
bd90: 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a   participate..**
bda0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bdb0: 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f  n is a pass-thro
bdc0: 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53  ugh to fcntl(F_S
bdd0: 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69  ETLK) if pFile i
bde0: 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56  s using.** any V
bdf0: 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75  FS other than "u
be00: 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20  nix-excl" or if 
be10: 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  pFile is opened 
be20: 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a  on "unix-excl".*
be30: 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e  * and is read-on
be40: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ly..**.** Zero i
be50: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
be60: 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73  e call completes
be70: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f   successfully, o
be80: 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a  r -1 if a call.*
be90: 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69  * to fcntl() fai
bea0: 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ls. In this case
beb0: 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61  , errno is set a
bec0: 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79  ppropriately (by
bed0: 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74   fcntl())..*/.st
bee0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
bef0: 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  eLock(unixFile *
bf00: 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c  pFile, struct fl
bf10: 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69  ock *pLock){.  i
bf20: 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f  nt rc;.  unixIno
bf30: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
bf40: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
bf50: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
bf60: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61  texHeld() );.  a
bf70: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30  ssert( pInode!=0
bf80: 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c   );.  if( ((pFil
bf90: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
bfa0: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30  NIXFILE_EXCL)!=0
bfb0: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f   || pInode->bPro
bfc0: 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20  cessLock).   && 
bfd0: 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ((pFile->ctrlFla
bfe0: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44  gs & UNIXFILE_RD
bff0: 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ONLY)==0).  ){. 
c000: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
c010: 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
c020: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66  {.      struct f
c030: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20  lock lock;.     
c040: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c050: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  >nLock==0 );.   
c060: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
c070: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
c080: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c090: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
c0a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
c0b0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c0c0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
c0d0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
c0e0: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
c0f0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
c100: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  K, &lock);.     
c110: 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75   if( rc<0 ) retu
c120: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e  rn rc;.      pIn
c130: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
c140: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  k = 1;.      pIn
c150: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
c160: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
c170: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
c180: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f  else{.    rc = o
c190: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
c1a0: 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29   F_SETLK, pLock)
c1b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
c1c0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
c1d0: 20 75 6e 69 78 4f 70 65 6e 28 73 71 6c 69 74 65   unixOpen(sqlite
c1e0: 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68  3_vfs*, const ch
c1f0: 61 72 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c  ar*, sqlite3_fil
c200: 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 20 2a 29 3b  e*, int, int *);
c210: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ..static int uni
c220: 78 4f 70 65 6e 41 6e 64 4c 6f 63 6b 28 75 6e 69  xOpenAndLock(uni
c230: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
c240: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
c250: 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
c260: 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20  e*)pFile;.  int 
c270: 65 4f 72 69 67 4c 6f 63 6b 20 3d 20 70 46 69 6c  eOrigLock = pFil
c280: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20  e->eFileLock;.  
c290: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
c2a0: 74 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  t( pFile->ctrlFl
c2b0: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
c2c0: 45 46 45 52 52 45 44 20 29 3b 0a 20 20 72 63 20  EFERRED );.  rc 
c2d0: 3d 20 75 6e 69 78 4f 70 65 6e 28 70 46 69 6c 65  = unixOpen(pFile
c2e0: 2d 3e 70 56 66 73 2c 20 70 46 69 6c 65 2d 3e 7a  ->pVfs, pFile->z
c2f0: 50 61 74 68 2c 20 69 64 2c 20 70 46 69 6c 65 2d  Path, id, pFile-
c300: 3e 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a  >openFlags, 0);.
c310: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c320: 5f 4f 4b 20 26 26 20 65 4f 72 69 67 4c 6f 63 6b  _OK && eOrigLock
c330: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 64 2d   ){.    rc = id-
c340: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b  >pMethods->xLock
c350: 28 69 64 2c 20 65 4f 72 69 67 4c 6f 63 6b 29 3b  (id, eOrigLock);
c360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c370: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
c380: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
c390: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
c3a0: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
c3b0: 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
c3c0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
c3d0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
c3e0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
c3f0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
c400: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
c410: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
c420: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
c430: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
c440: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
c450: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
c460: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
c470: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
c480: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
c490: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
c4a0: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
c4b0: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
c4c0: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
c4d0: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
c4e0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
c4f0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
c500: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
c510: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
c520: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
c530: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
c540: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
c550: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
c560: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
c570: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
c580: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
c590: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
c5a0: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
c5b0: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
c5c0: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
c5d0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
c5e0: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
c5f0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
c600: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
c610: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
c620: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
c630: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
c640: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
c650: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
c660: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
c670: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
c680: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
c690: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
c6a0: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c  int unixLock(sql
c6b0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
c6c0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
c6d0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
c6e0: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
c6f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
c700: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
c710: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
c720: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
c730: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
c740: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
c750: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
c760: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
c770: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
c780: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
c790: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
c7a0: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
c7b0: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
c7c0: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
c7d0: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
c7e0: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
c7f0: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
c800: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
c810: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69  mpatible with wi
c820: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69  ndows systems si
c830: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a  multaneously.  *
c840: 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  * accessing the 
c850: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
c860: 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74  le, in case that
c870: 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65   is ever require
c880: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d  d..  **.  ** Sym
c890: 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20  bols defined in 
c8a0: 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74  os.h indentify t
c8b0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
c8c0: 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72  ' and the 'reser
c8d0: 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20  ved.  ** byte', 
c8e0: 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65  each single byte
c8f0: 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  s at well known 
c900: 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65  offsets, and the
c910: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
c920: 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e  ** range', a ran
c930: 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20  ge of 510 bytes 
c940: 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  at a well known 
c950: 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  offset..  **.  *
c960: 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  * To obtain a SH
c970: 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61  ARED lock, a rea
c980: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
c990: 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ed on the 'pendi
c9a0: 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20  ng.  ** byte'.  
c9b0: 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
c9c0: 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20  ssful, a random 
c9d0: 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73  byte from the 's
c9e0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
c9f0: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
ca00: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  ocked and the lo
ca10: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
ca20: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
ca30: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  d..  **.  ** A p
ca40: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
ca50: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
ca60: 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  D lock after it 
ca70: 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  has a SHARED loc
ca80: 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56  k..  ** A RESERV
ca90: 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  ED lock is imple
caa0: 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69  mented by grabbi
cab0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
cac0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73  on the.  ** 'res
cad0: 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20  erved byte'. .  
cae0: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
caf0: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
cb00: 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  n a PENDING lock
cb10: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62   after it has ob
cb20: 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48  tained a.  ** SH
cb30: 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e  ARED lock. A PEN
cb40: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70  DING lock is imp
cb50: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
cb60: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
cb70: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27  ck.  ** on the '
cb80: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54  pending byte'. T
cb90: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
cba0: 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c   no new SHARED l
cbb0: 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a  ocks can be.  **
cbc0: 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65   obtained, but e
cbd0: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
cbe0: 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ocks are allowed
cbf0: 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70   to persist. A p
cc00: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73  rocess.  ** does
cc10: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74   not have to obt
cc20: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
cc30: 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ock on the way t
cc40: 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  o a PENDING lock
cc50: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70  ..  ** This prop
cc60: 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20  erty is used by 
cc70: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  the algorithm fo
cc80: 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
cc90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
cca0: 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ** after a crash
ccb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45  ..  **.  ** An E
ccc0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f  XCLUSIVE lock, o
ccd0: 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20  btained after a 
cce0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
ccf0: 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d  held, is.  ** im
cd00: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
cd10: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
cd20: 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72  ock on the entir
cd30: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
cd40: 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63   ** range'. Sinc
cd50: 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b  e all other lock
cd60: 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64  s require a read
cd70: 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20  -lock on one of 
cd80: 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77  the bytes.  ** w
cd90: 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65  ithin this range
cda0: 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
cdb0: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63  hat no other loc
cdc0: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74  ks are held on t
cdd0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
cde0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
cdf0: 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65   reason a single
ce00: 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   byte cannot be 
ce10: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
ce20: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
ce30: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
ce40: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
ce50: 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f  ns of windows do
ce60: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61   not support rea
ce70: 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a  d-locks. By.  **
ce80: 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f   locking a rando
ce90: 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61  m byte from a ra
cea0: 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  nge, concurrent 
ceb0: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79  SHARED locks may
cec0: 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e   exist.  ** even
ced0: 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   if the locking 
cee0: 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69  primitive used i
cef0: 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65  s always a write
cf00: 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e  -lock..  */.  in
cf10: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
cf20: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
cf30: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
cf40: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
cf50: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
cf60: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
cf70: 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  k;.  int tErrno 
cf80: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
cf90: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
cfa0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
cfb0: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
cfc0: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
cfd0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
cfe0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
cff0: 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
d000: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
d010: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a  eLock),.      az
d020: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
d030: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d040: 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  k), pFile->pInod
d050: 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74  e->nShared , get
d060: 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  pid()));..  /* I
d070: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
d080: 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
d090: 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
d0a0: 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
d0b0: 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
d0c0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
d0d0: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
d0e0: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
d0f0: 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
d100: 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
d110: 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
d120: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
d130: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
d140: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
d150: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
d160: 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
d170: 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c  dy held) (unix)\
d180: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
d190: 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
d1a0: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
d1b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
d1c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
d1d0: 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
d1e0: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
d1f0: 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20  DEFERRED ){.    
d200: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
d210: 68 20 3d 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  h = pFile->zPath
d220: 3b 20 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 2d  ;       /* Full-
d230: 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
d240: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74   file */.    int
d250: 20 65 4f 72 69 67 4c 6f 63 6b 3b 20 20 20 20 20   eOrigLock;     
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
d280: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 70 46 69  lock held on pFi
d290: 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  le */..    asser
d2a0: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
d2b0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d2c0: 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
d2d0: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
d2e0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 53 51 4c 69  ..    /* If SQLi
d2f0: 74 65 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  te is requesting
d300: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
d310: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
d320: 66 69 6c 65 20 64 6f 65 73 0a 20 20 20 20 2a 2a  file does.    **
d330: 20 6e 6f 74 20 65 78 69 73 74 2c 20 72 65 74 75   not exist, retu
d340: 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74  rn early without
d350: 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
d360: 65 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 65  e. */ .    if( e
d370: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
d380: 5f 4c 4f 43 4b 20 26 26 20 6f 73 41 63 63 65 73  _LOCK && osAcces
d390: 73 28 7a 50 61 74 68 2c 20 46 5f 4f 4b 29 20 26  s(zPath, F_OK) &
d3a0: 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20  & errno==ENOENT 
d3b0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
d3c0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
d3d0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 72  ED_LOCK;.      r
d3e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d3f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
d400: 72 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  r, if the databa
d410: 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
d420: 20 63 72 65 61 74 65 64 20 6f 72 20 61 20 77 72   created or a wr
d430: 69 74 65 20 6c 6f 63 6b 20 69 73 20 0a 20 20 20  ite lock is .   
d440: 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 6f   ** requested, o
d450: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
d460: 20 66 69 6c 65 20 6e 6f 77 2e 20 20 2a 2f 0a 20   file now.  */. 
d470: 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e     rc = unixOpen
d480: 41 6e 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  AndLock(pFile);.
d490: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d4a0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
d4b0: 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
d4c0: 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
d4d0: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
d4e0: 46 45 52 52 45 44 29 3d 3d 30 20 29 3b 0a 0a 20  FERRED)==0 );.. 
d4f0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
d500: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
d510: 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  ce is correct.. 
d520: 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
d530: 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
d540: 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
d550: 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
d560: 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
d570: 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
d580: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
d590: 65 73 74 73 20 61 20 70 65 6e 64 69 6e 67 20 6c  ests a pending l
d5a0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
d5b0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
d5c0: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
d5d0: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
d5e0: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
d5f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
d600: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
d610: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
d620: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d630: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
d640: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
d650: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
d660: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
d670: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
d680: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d690: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
d6a0: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
d6b0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
d6c0: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
d6d0: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
d6e0: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
d6f0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
d700: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
d710: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
d720: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
d730: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
d740: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
d750: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
d760: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
d770: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
d780: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d790: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
d7a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
d7b0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
d7c0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d7d0: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
d7e0: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
d7f0: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
d800: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
d810: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
d820: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d830: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
d840: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
d850: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
d860: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
d870: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
d880: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
d890: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
d8a0: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
d8b0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
d8c0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
d8d0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
d8e0: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
d8f0: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
d900: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
d910: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
d920: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
d930: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d940: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
d950: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
d960: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
d970: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d980: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d990: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d9a0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d9b0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d9c0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
d9d0: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
d9e0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
d9f0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
da00: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
da10: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
da20: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
da30: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
da40: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
da50: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
da60: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
da70: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
da80: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
da90: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
daa0: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
dab0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
dac0: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
dad0: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
dae0: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
daf0: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
db00: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
db10: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
db20: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
db30: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
db40: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
db50: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
db60: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
db70: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
db80: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
db90: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
dba0: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
dbb0: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
dbc0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
dbd0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
dbe0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
dbf0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
dc00: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
dc10: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
dc20: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
dc30: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
dc40: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
dc50: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
dc60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
dc70: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70  USY ){.        p
dc80: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
dc90: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
dca0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
dcb0: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
dcc0: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
dcd0: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
dce0: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
dcf0: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
dd00: 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
dd10: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
dd20: 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
dd30: 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
dd40: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
dd50: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
dd60: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
dd70: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
dd80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
dd90: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
dda0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
ddb0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ddc0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
ddd0: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
dde0: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
ddf0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
de00: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
de10: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
de20: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
de30: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
de40: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
de50: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
de60: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
de70: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
de80: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
de90: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
dea0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
deb0: 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
dec0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
ded0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
dee0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
def0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
df00: 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e   = 1L;.    lock.
df10: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
df20: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
df30: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
df40: 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49  ock) && rc==SQLI
df50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
df60: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70  * This could hap
df70: 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f  pen with a netwo
df80: 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rk mount */.    
df90: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
dfa0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
dfb0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
dfc0: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
dfd0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
dfe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
dff0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
e000: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e010: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
e020: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
e030: 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
e040: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
e050: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
e060: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
e070: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
e080: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
e090: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
e0a0: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
e0b0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
e0c0: 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
e0d0: 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
e0e0: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
e0f0: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
e100: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
e110: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
e120: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
e130: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
e140: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
e150: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
e160: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
e170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
e180: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
e190: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
e1a0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
e1b0: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
e1c0: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
e1d0: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
e1e0: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
e1f0: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
e200: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
e210: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
e220: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e230: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
e240: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
e250: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
e260: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
e270: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
e280: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
e290: 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
e2a0: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
e2b0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
e2c0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
e2d0: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
e2e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e2f0: 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
e300: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
e310: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
e320: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
e330: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
e340: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
e350: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e360: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
e370: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
e380: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
e390: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
e3a0: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
e3b0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
e3c0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
e3d0: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
e3e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
e3f0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
e400: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
e410: 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64    }.  }.  ..#ifd
e420: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
e430: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
e440: 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e  transaction-coun
e450: 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b  ter change check
e460: 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20  ing flags when. 
e470: 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e   ** transitionin
e480: 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20  g from a SHARED 
e490: 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  to a RESERVED lo
e4a0: 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a  ck.  The change.
e4b0: 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44    ** from SHARED
e4c0: 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72   to RESERVED mar
e4d0: 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ks the beginning
e4e0: 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a   of a normal.  *
e4f0: 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  * write operatio
e500: 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75  n (not a hot jou
e510: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
e520: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
e530: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
e540: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
e550: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
e560: 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  && eFileLock==RE
e570: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
e580: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
e590: 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
e5a0: 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
e5b0: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
e5c0: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
e5d0: 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
e5e0: 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
e5f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
e600: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
e610: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
e620: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e630: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
e640: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
e650: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
e660: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
e670: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
e680: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
e690: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
e6a0: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
e6b0: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
e6c0: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
e6d0: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
e6e0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
e6f0: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
e700: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
e710: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
e720: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
e730: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
e740: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
e750: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
e760: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
e770: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
e780: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
e790: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
e7a0: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
e7b0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
e7c0: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
e7d0: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
e7e0: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
e7f0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
e800: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
e810: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
e820: 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
e830: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
e840: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
e850: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
e860: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
e870: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
e880: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
e890: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
e8a0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
e8b0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
e8c0: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
e8d0: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
e8e0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
e8f0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
e900: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
e910: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
e920: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
e930: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
e940: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
e950: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
e960: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
e970: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
e980: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
e990: 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
e9a0: 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
e9b0: 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
e9c0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
e9d0: 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
e9e0: 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
e9f0: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
ea00: 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
ea10: 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
ea20: 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
ea30: 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
ea40: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
ea50: 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
ea60: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
ea70: 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
ea80: 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
ea90: 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
eaa0: 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
eab0: 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
eac0: 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
ead0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
eae0: 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
eaf0: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
eb00: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
eb10: 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71  t posixUnlock(sq
eb20: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
eb30: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
eb40: 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
eb50: 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
eb60: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
eb70: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
eb80: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
eb90: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
eba0: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
ebb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
ebc0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
ebd0: 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
ebe0: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
ebf0: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
ec00: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
ec10: 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
ec20: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
ec30: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
ec40: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
ec50: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
ec60: 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67  nShared,.      g
ec70: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
ec80: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
ec90: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
eca0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
ecb0: 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
ecc0: 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
ecd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
ece0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
ecf0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
ed00: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
ed10: 46 49 4c 45 5f 44 45 46 45 52 52 45 44 20 29 20  FILE_DEFERRED ) 
ed20: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
ed30: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
ed40: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
ed50: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
ed60: 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
ed70: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ed80: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
ed90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
eda0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
edb0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
edc0: 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
edd0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
ede0: 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
edf0: 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
ee00: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
ee10: 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
ee20: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
ee30: 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
ee40: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
ee50: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
ee60: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
ee70: 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
ee80: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
ee90: 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
eea0: 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
eeb0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
eec0: 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
eed0: 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
eee0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
eef0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
ef00: 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
ef10: 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
ef20: 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
ef30: 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
ef40: 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
ef50: 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
ef60: 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
ef70: 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
ef80: 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
ef90: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
efa0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
efb0: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
efc0: 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
efd0: 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
efe0: 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
eff0: 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
f000: 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
f010: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
f020: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
f030: 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
f040: 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
f050: 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
f060: 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
f070: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
f080: 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
f090: 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
f0a0: 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
f0b0: 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
f0c0: 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
f0d0: 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
f0e0: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
f0f0: 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
f100: 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
f110: 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
f120: 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
f130: 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
f140: 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
f150: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
f160: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
f170: 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65 66 69  CK ){..#if !defi
f180: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
f190: 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
f1a0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
f1b0: 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
f1c0: 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
f1d0: 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
f1e0: 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
f1f0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
f200: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
f210: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
f220: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
f230: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
f240: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
f250: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
f260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
f270: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
f280: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
f290: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  s */.        off
f2a0: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
f2b0: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
f2c0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
f2d0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
f2e0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
f2f0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
f300: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
f310: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
f320: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
f330: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
f340: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
f350: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
f360: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
f370: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
f380: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
f390: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
f3a0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
f3b0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
f3c0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
f3d0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
f3e0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
f3f0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
f400: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
f410: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
f420: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
f430: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
f440: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
f450: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
f460: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f470: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
f480: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f490: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
f4a0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
f4b0: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
f4c0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f4d0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
f4e0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
f4f0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
f500: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
f510: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
f520: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
f530: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
f540: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
f550: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
f560: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
f570: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
f580: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
f590: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
f5a0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
f5b0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
f5c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
f5d0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f5e0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
f5f0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f600: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
f610: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f620: 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
f630: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
f640: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
f650: 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
f660: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
f670: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
f680: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
f690: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
f6a0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
f6b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
f6c0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
f6d0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
f6e0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
f6f0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
f700: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
f710: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
f720: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
f730: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
f740: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
f750: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
f760: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
f770: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
f780: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
f790: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
f7a0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
f7b0: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  RDLCK;.        l
f7c0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f7d0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
f7e0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f7f0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
f800: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
f810: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
f820: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
f830: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
f840: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
f850: 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79      /* In theory
f860: 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  , the call to un
f870: 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e  ixFileLock() can
f880: 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65  not fail because
f890: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20   another.       
f8a0: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73     ** process is
f8b0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f   holding an inco
f8c0: 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49  mpatible lock. I
f8d0: 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20  f it does, this 
f8e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
f8f0: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
f900: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
f910: 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20  s not following 
f920: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20  the locking.    
f930: 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f        ** protoco
f940: 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  l. If this happe
f950: 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
f960: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20  E_IOERR_RDLOCK. 
f970: 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20  Returning.      
f980: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
f990: 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65  SY would confuse
f9a0: 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
f9b0: 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74   (in practice it
f9c0: 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20   causes .       
f9d0: 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20     ** an assert 
f9e0: 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20  to fail). */ .  
f9f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
fa00: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
fa10: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  ;.          pFil
fa20: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
fa30: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
fa40: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
fa50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fa60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
fa70: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
fa80: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
fa90: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
faa0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
fab0: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
fac0: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
fad0: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
fae0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
faf0: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
fb00: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
fb10: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
fb20: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
fb30: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
fb40: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
fb50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fb60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
fb70: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
fb80: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
fb90: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
fba0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
fbb0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
fbc0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  if( eFileLock==N
fbd0: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
fbe0: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
fbf0: 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
fc00: 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
fc10: 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
fc20: 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
fc30: 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
fc40: 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
fc50: 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
fc60: 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
fc70: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
fc80: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
fc90: 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
fca0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
fcb0: 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
fcc0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
fcd0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
fce0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
fcf0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
fd00: 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
fd10: 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28   = 0L;.      if(
fd20: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
fd30: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
fd40: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
fd50: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
fd60: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
fd70: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
fd80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
fd90: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
fda0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
fdb0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
fdc0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
fdd0: 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
fde0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
fdf0: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
fe00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
fe10: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
fe20: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f   the count of lo
fe30: 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73  cks against this
fe40: 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65   same file.  Whe
fe50: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75  n the.    ** cou
fe60: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  nt reaches zero,
fe70: 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72   close any other
fe80: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
fe90: 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20  s whose close.  
fea0: 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65    ** was deferre
feb0: 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74  d because of out
fec0: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a  standing locks..
fed0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64      */.    pInod
fee0: 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  e->nLock--;.    
fef0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
ff00: 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
ff10: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
ff20: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c  k==0 ){.      cl
ff30: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
ff40: 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
ff50: 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75  .end_unlock:.  u
ff60: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
ff70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
ff80: 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
ff90: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
ffa0: 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
ffb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
ffc0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
ffd0: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
ffe0: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
fff0: 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
10000 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
10010 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
10020 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
10030 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
10040 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
10050 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10060 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
10070 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
10080 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
10090 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
100a0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
100b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
100c0 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
100d0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
100e0 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20  eFileLock){.#if 
100f0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
10100 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28  SIZE>0.  assert(
10110 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
10120 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69  ED_LOCK || ((uni
10130 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65  xFile *)id)->nFe
10140 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e  tchOut==0 );.#en
10150 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  dif.  return pos
10160 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
10170 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23  leLock, 0);.}..#
10180 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
10190 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63  AP_SIZE>0.static
101a0 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65   int unixMapfile
101b0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20  (unixFile *pFd, 
101c0 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74  i64 nByte);.stat
101d0 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61  ic void unixUnma
101e0 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
101f0 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  pFd);.#endif../*
10200 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
10210 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70  n performs the p
10220 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f  arts of the "clo
10230 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69  se file" operati
10240 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f  on .** common to
10250 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68   all locking sch
10260 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20  emes. It closes 
10270 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e  the directory an
10280 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65  d file.** handle
10290 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76  s, if they are v
102a0 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61  alid, and sets a
102b0 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
102c0 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
102d0 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a  ucture to 0..**.
102e0 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e  ** It is *not* n
102f0 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64  ecessary to hold
10300 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20   the mutex when 
10310 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
10320 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20  called,.** even 
10330 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d  on VxWorks.  A m
10340 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71  utex will be acq
10350 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  uired on VxWorks
10360 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72   by the.** vxwor
10370 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
10380 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
10390 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e  atic int closeUn
103a0 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66  ixFile(sqlite3_f
103b0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
103c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
103d0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66  nixFile*)id;.#if
103e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
103f0 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e  _SIZE>0.  unixUn
10400 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
10410 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69  #endif.  if( pFi
10420 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  le->h>=0 ){.    
10430 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
10440 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f  le, pFile->h, __
10450 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69  LINE__);.    pFi
10460 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a  le->h = -1;.  }.
10470 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
10480 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20   if( pFile->pId 
10490 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  ){.    if( pFile
104a0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
104b0 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b  IXFILE_DELETE ){
104c0 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
104d0 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e  pFile->pId->zCan
104e0 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
104f0 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65   }.    vxworksRe
10500 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c  leaseFileId(pFil
10510 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69  e->pId);.    pFi
10520 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d  le->pId = 0;.  }
10530 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
10540 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E(("CLOSE   %-3d
10550 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
10560 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
10570 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
10580 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  ee(pFile->pUnuse
10590 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69  d);.  memset(pFi
105a0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
105b0 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75  ixFile));.  retu
105c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
105d0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
105e0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
105f0 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c  nt unixClose(sql
10600 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
10610 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10620 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
10630 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10640 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76 65 72 69  ile *)id;.  veri
10650 66 79 44 62 46 69 6c 65 28 70 46 69 6c 65 29 3b  fyDbFile(pFile);
10660 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64  .  unixUnlock(id
10670 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e  , NO_LOCK);.  un
10680 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
10690 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70  .  /* unixFile.p
106a0 49 6e 6f 64 65 20 6d 61 79 20 62 65 20 4e 55 4c  Inode may be NUL
106b0 4c 20 68 65 72 65 20 69 66 20 74 68 65 20 66 69  L here if the fi
106c0 6c 65 20 77 61 73 20 6e 65 76 65 72 20 6f 70 65  le was never ope
106d0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ned..  */.  asse
106e0 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
106f0 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  e==0 .       || 
10700 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
10710 4c 6f 63 6b 3e 30 20 0a 20 20 20 20 20 20 20 7c  Lock>0 .       |
10720 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
10730 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
10740 20 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 46 69   .  );.  if( pFi
10750 6c 65 2d 3e 70 49 6e 6f 64 65 20 29 7b 0a 20 20  le->pInode ){.  
10760 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
10770 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  ode->nLock ){.  
10780 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
10790 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
107a0 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
107b0 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
107c0 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20   file just.     
107d0 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
107e0 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
107f0 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
10800 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
10810 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
10820 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
10830 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74  de->pUnused list
10840 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
10850 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
10860 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  ed .      ** whe
10870 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  n the last lock 
10880 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
10890 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65    */.      setPe
108a0 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
108b0 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
108c0 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
108d0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c  );.  }.  rc = cl
108e0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
108f0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
10900 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
10910 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
10920 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
10930 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
10940 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
10950 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
10960 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a00 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
10a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a20 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
10a30 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
10a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a50 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
10a60 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
10a70 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
10a80 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
10a90 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
10aa0 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
10ab0 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
10ac0 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
10ad0 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
10ae0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
10af0 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
10b00 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
10b10 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
10b20 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
10b30 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
10b40 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
10b50 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
10b60 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
10b70 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
10b80 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
10b90 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
10ba0 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
10bb0 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
10bc0 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
10bd0 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
10be0 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
10bf0 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
10c00 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
10c10 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
10c20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
10c30 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
10c40 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
10c50 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
10c60 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
10c70 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
10c80 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
10c90 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
10ca0 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
10cb0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10cc0 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
10cd0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
10ce0 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
10cf0 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
10d00 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
10d10 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
10d20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
10d30 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
10d40 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
10d50 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10d60 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
10d70 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
10d80 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
10d90 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
10da0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
10db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
10dc0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
10dd0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10de0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
10df0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
10e00 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
10e10 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
10e20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10e30 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
10e40 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
10e50 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
10e60 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
10e70 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
10e80 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
10e90 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
10ea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10ec0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
10ed0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
10ee0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
10ef0 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
10f00 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
10f10 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
10f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
10f30 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
10f40 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
10f50 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10f60 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
10f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11000 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
11030 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
11040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11050 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
11060 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
11070 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
11080 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
11090 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
110a0 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
110b0 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
110c0 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
110d0 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
110e0 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
110f0 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
11100 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
11110 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
11120 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
11130 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
11140 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
11150 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
11160 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
11170 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
11180 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
11190 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
111a0 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
111b0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
111c0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
111d0 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
111e0 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
111f0 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
11200 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
11210 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
11220 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
11230 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
11240 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
11250 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
11260 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
11270 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
11280 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
11290 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
112a0 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
112b0 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
112c0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
112d0 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
112e0 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
112f0 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
11300 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
11310 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
11320 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
11330 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
11340 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
11350 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
11360 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
11370 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
11380 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
11390 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
113a0 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
113b0 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
113c0 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
113d0 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
113e0 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
113f0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
11400 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
11410 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
11420 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
11430 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
11440 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
11450 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
11460 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
11470 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
11480 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
11490 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
114a0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
114b0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
114c0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
114d0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
114e0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
114f0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
11500 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
11510 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
11520 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
11530 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
11540 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
11550 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
11560 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
11570 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
11580 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
11590 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
115a0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
115b0 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
115c0 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
115d0 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
115e0 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
115f0 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
11600 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
11610 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
11620 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
11630 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
11640 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
11650 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
11660 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
11670 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11680 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
11690 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
116a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
116b0 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
116c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
116d0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
116e0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
116f0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11700 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
11710 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
11720 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
11730 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
11740 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
11750 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
11760 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
11770 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
11780 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
11790 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
117a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
117b0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
117c0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
117d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
117e0 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
117f0 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
11800 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
11810 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
11820 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
11830 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
11840 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
11850 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
11860 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
11870 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
11880 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
11890 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
118a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
118b0 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
118c0 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
118d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
118e0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f      reserved = o
118f0 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c  sAccess(zLockFil
11900 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
11910 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
11920 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
11930 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
11940 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
11950 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
11960 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11970 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11980 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
11990 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
119a0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
119b0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
119c0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
119d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
119e0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
119f0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
11a00 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
11a10 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
11a20 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
11a30 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
11a40 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
11a50 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
11a60 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11a70 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
11a80 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
11a90 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
11aa0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
11ab0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
11ac0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
11ad0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11ae0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
11af0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
11b00 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
11b10 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
11b20 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
11b30 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11b40 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11b50 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11b60 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11b70 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11b80 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11b90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
11ba0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
11bb0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
11bc0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
11bd0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
11be0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11bf0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11c00 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11c10 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11c20 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11c30 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
11c40 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
11c50 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
11c60 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
11c70 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
11c80 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
11c90 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
11ca0 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
11cb0 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
11cc0 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
11cd0 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
11ce0 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
11cf0 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
11d00 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
11d10 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
11d20 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11d30 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
11d40 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
11d50 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
11d60 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11d70 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11d80 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
11d90 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
11da0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
11db0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11dc0 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
11dd0 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
11de0 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
11df0 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
11e00 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
11e10 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
11e20 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
11e30 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
11e40 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
11e50 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11e60 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
11e70 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
11e80 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
11e90 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a  FileLock;.    /*
11ea0 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
11eb0 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
11ec0 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
11ed0 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
11ee0 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63  E.    utime(zLoc
11ef0 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
11f00 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a  lse.    utimes(z
11f10 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
11f20 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
11f30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11f40 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
11f50 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11f60 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64   */.  rc = osMkd
11f70 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37  ir(zLockFile, 07
11f80 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  77);.  if( rc<0 
11f90 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
11fa0 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
11fb0 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  the lock directo
11fc0 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45  ry */.    int tE
11fd0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11fe0 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20    if( EEXIST == 
11ff0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
12000 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
12010 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
12020 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12030 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
12040 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
12050 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
12060 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
12070 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
12080 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
12090 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
120a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
120b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
120c0 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20   } .  .  /* got 
120d0 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
120e0 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
120f0 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
12100 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
12110 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12120 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
12130 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12140 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
12150 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
12160 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
12170 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
12180 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
12190 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
121a0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
121b0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
121c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
121d0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
121e0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
121f0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
12200 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
12210 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
12220 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
12230 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
12240 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
12250 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
12260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12270 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
12280 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12290 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
122a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
122b0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
122c0 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
122d0 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
122e0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
122f0 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ntext;.  int rc;
12300 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
12310 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
12320 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
12330 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f  as %d pid=%d (do
12340 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
12350 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
12360 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
12370 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74  ->eFileLock, get
12380 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72  pid()));.  asser
12390 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
123a0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
123b0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
123c0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
123d0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
123e0 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
123f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12400 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
12410 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
12420 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
12430 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
12440 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
12450 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
12460 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
12470 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
12480 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
12490 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
124a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
124b0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
124c0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
124d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
124e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
124f0 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c   /* To fully unl
12500 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
12510 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
12520 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65  k file */.  asse
12530 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  rt( eFileLock==N
12540 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  O_LOCK );.  rc =
12550 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69   osRmdir(zLockFi
12560 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
12570 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49  && errno==ENOTDI
12580 52 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e  R ) rc = osUnlin
12590 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20  k(zLockFile);.  
125a0 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
125b0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
125c0 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a  no;.    rc = 0;.
125d0 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21      if( ENOENT !
125e0 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
125f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
12600 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
12610 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
12620 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
12630 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
12640 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
12650 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
12660 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
12670 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
12680 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
12690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
126a0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
126b0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
126c0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
126d0 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
126e0 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  closing..*/.stat
126f0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c  ic int dotlockCl
12700 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
12710 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
12720 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12730 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
12740 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12750 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12760 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b     dotlockUnlock
12770 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
12780 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12790 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
127a0 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d  ntext);.    rc =
127b0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
127c0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
127d0 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   rc;.}./********
127e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
127f0 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
12800 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
12810 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
12820 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12870 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
12880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
128d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128e0 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
128f0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
12900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12910 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
12920 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
12930 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
12940 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
12950 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
12960 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
12970 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
12980 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
12990 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
129a0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
129b0 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
129c0 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
129d0 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
129e0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
129f0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
12a00 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
12a10 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
12a20 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
12a30 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
12a40 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
12a50 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
12a60 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
12a70 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
12a80 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
12a90 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
12aa0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
12ab0 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
12ac0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
12ad0 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
12ae0 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
12af0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
12b00 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
12b10 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
12b20 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c   or if.** compil
12b30 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e  ing for VXWORKS.
12b40 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
12b50 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12b60 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
12b70 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  KS../*.** Retry 
12b80 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68  flock() calls th
12b90 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e  at fail with EIN
12ba0 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e  TR.*/.#ifdef EIN
12bb0 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  TR.static int ro
12bc0 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66  bust_flock(int f
12bd0 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  d, int op){.  in
12be0 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
12bf0 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d   flock(fd,op); }
12c00 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
12c10 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
12c20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
12c30 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62  lse.# define rob
12c40 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66  ust_flock(a,b) f
12c50 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66  lock(a,b).#endif
12c60 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .     ../*.** Th
12c70 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
12c80 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
12c90 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
12ca0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
12cb0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
12cc0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
12cd0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
12ce0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
12cf0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
12d00 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
12d10 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
12d20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
12d30 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
12d40 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
12d50 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
12d60 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
12d70 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
12d80 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
12d90 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
12da0 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
12db0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
12dc0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
12dd0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
12de0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12df0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
12e00 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
12e10 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12e20 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
12e30 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
12e40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12e50 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
12e60 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
12e70 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20  t( pFile );.  . 
12e80 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
12e90 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
12ea0 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
12eb0 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
12ec0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12ed0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
12ee0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
12ef0 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
12f00 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
12f10 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
12f20 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
12f30 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
12f40 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70  ){.    /* attemp
12f50 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
12f60 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  k */.    int lrc
12f70 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
12f80 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
12f90 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20  X | LOCK_NB);.  
12fa0 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20    if( !lrc ){.  
12fb0 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c      /* got the l
12fc0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a  ock, unlock it *
12fd0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f  /.      lrc = ro
12fe0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
12ff0 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
13000 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20       if ( lrc ) 
13010 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
13020 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
13030 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
13040 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65  failed with an e
13050 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
13060 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  lrc = SQLITE_IOE
13070 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20  RR_UNLOCK; .    
13080 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
13090 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
130a0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
130b0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
130c0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
130d0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
130e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
130f0 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
13100 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
13110 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
13120 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
13130 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
13140 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
13150 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
13160 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13170 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13180 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
13190 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
131a0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
131b0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
131c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
131d0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
131e0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
131f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13200 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
13210 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
13220 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
13230 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
13240 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ed));..#ifdef SQ
13250 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
13260 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
13270 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
13280 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
13290 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
132a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
132b0 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
132c0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
132d0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
132e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
132f0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
13300 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
13310 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
13320 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
13330 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
13340 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
13350 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
13360 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
13370 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
13380 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
13390 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
133a0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
133b0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
133c0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
133d0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
133e0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
133f0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
13400 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
13410 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
13420 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
13430 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
13440 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
13450 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
13460 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
13470 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
13480 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
13490 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
134a0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
134b0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
134c0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
134d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
134e0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
134f0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
13500 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
13510 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
13520 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
13530 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
13540 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
13550 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
13560 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
13570 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
13580 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
13590 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
135a0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
135b0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
135c0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
135d0 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61  flock() only rea
135e0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
135f0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
13600 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
13610 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
13620 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
13630 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
13640 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
13650 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
13660 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
13670 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
13680 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
13690 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
136a0 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
136b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
136c0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
136d0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
136e0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
136f0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
13700 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
13710 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
13720 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
13730 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  nt flockLock(sql
13740 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13750 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13760 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13770 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
13780 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13790 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
137a0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
137b0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
137c0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
137d0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
137e0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
137f0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
13800 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
13810 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
13820 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
13830 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
13840 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13850 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
13860 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13870 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
13880 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
13890 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f  k */.  .  if (ro
138a0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
138b0 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
138c0 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
138d0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
138e0 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
138f0 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
13900 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
13910 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
13920 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
13930 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
13940 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
13950 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13960 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13970 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
13980 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
13990 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
139a0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
139b0 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
139c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
139d0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
139e0 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  k;.  }.  OSTRACE
139f0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
13a00 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %s (flock)\n", 
13a10 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
13a20 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
13a30 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
13a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
13a50 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
13a60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
13a70 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13a80 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
13a90 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
13aa0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
13ab0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13ac0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
13ad0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
13ae0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
13af0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74  _ERRORS */.  ret
13b00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
13b10 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
13b20 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
13b30 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
13b40 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
13b50 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
13b60 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
13b70 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
13b80 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
13b90 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13ba0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
13bb0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
13bc0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
13bd0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
13be0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
13bf0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13c00 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
13c10 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63  c int flockUnloc
13c20 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
13c30 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
13c40 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
13c50 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13c60 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
13c70 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
13c80 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
13c90 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
13ca0 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  id=%d (flock)\n"
13cb0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
13cc0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
13cd0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13ce0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
13cf0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
13d00 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
13d10 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
13d20 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
13d30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
13d40 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
13d50 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
13d60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13d70 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
13d80 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
13d90 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
13da0 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
13db0 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
13dc0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
13dd0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
13de0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13df0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
13e00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13e10 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
13e20 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
13e30 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
13e40 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
13e50 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
13e60 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
13e70 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
13e80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13e90 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
13ea0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
13eb0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
13ec0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
13ed0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
13ee0 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
13ef0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13f00 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
13f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13f20 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
13f30 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
13f40 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
13f50 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
13f60 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
13f70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13f80 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
13f90 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
13fa0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72   NO_LOCK);.    r
13fb0 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
13fc0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
13fd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
13fe0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
13ff0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
14000 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
14010 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
14020 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
14030 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
14040 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
14050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14060 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
14070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140b0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
140c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14100 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
14110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
14120 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
14130 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
14140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14150 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
14160 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
14170 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
14180 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
14190 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
141a0 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
141b0 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
141c0 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
141d0 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
141e0 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
141f0 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
14200 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
14210 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
14220 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
14230 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
14240 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
14250 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
14260 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
14270 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
14280 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
14290 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
142a0 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
142b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
142c0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
142d0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
142e0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
142f0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
14300 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
14310 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
14320 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
14330 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
14340 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
14350 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
14360 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
14370 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
14380 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
14390 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
143a0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
143b0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
143c0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
143d0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
143e0 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73   int semCheckRes
143f0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
14400 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14410 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
14420 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14430 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
14440 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
14450 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14460 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
14470 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
14480 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14490 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
144a0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
144b0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
144c0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
144d0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
144e0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
144f0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
14500 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14510 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
14520 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
14530 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
14540 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
14550 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
14560 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
14570 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
14580 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
14590 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
145a0 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72  e->pSem;.    str
145b0 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
145c0 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74  ;..    if( sem_t
145d0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
145e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
145f0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
14600 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21      if( EAGAIN !
14610 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
14620 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
14630 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
14640 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
14650 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14660 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
14670 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
14680 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
14690 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
146a0 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
146b0 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
146c0 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
146d0 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
146e0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
146f0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
14700 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  k < SHARED_LOCK)
14710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
14720 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
14730 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
14740 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
14750 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
14760 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
14770 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
14780 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
14790 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
147a0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
147b0 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
147c0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
147d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
147e0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
147f0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
14800 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
14810 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
14820 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
14830 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
14840 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
14850 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
14860 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
14870 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
14880 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
14890 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
148a0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
148b0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
148c0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
148d0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
148e0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
148f0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
14900 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
14910 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
14920 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
14930 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
14940 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
14950 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
14960 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
14970 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
14980 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
14990 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
149a0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
149b0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
149c0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
149d0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
149e0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
149f0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
14a00 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
14a10 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
14a20 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
14a30 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
14a40 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
14a50 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
14a60 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
14a70 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
14a80 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
14a90 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
14aa0 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
14ab0 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
14ac0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
14ad0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
14ae0 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
14af0 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
14b00 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
14b10 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
14b20 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
14b30 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
14b40 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
14b50 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
14b60 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
14b70 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
14b80 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
14b90 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
14ba0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
14bb0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
14bc0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
14bd0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
14be0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
14bf0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
14c00 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  t semLock(sqlite
14c10 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14c20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14c30 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14c40 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14c50 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f    int fd;.  sem_
14c60 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
14c70 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
14c80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14c90 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
14ca0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
14cb0 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
14cc0 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
14cd0 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
14ce0 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
14cf0 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
14d00 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
14d10 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
14d20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14d30 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14d40 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14d50 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
14d60 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
14d70 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
14d80 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
14d90 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
14da0 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
14db0 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
14dc0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
14dd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
14de0 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
14df0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
14e00 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
14e10 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
14e20 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
14e30 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14e40 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65   eFileLock;.. se
14e50 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
14e60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14e70 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
14e80 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
14e90 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
14ea0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
14eb0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
14ec0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
14ed0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
14ee0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
14ef0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
14f00 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
14f10 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
14f20 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
14f30 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
14f40 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
14f50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
14f60 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
14f70 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
14f80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14f90 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14fa0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
14fb0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14fc0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
14fd0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
14fe0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
14ff0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
15000 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
15010 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
15020 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
15030 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
15040 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
15050 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
15060 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15070 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
15080 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
15090 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
150a0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
150b0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
150c0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
150d0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
150e0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
150f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15100 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
15110 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
15120 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
15130 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
15140 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
15150 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15160 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
15170 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
15180 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
15190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
151a0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
151b0 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  eally unlock. */
151c0 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74  .  if ( sem_post
151d0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20  (pSem)==-1 ) {. 
151e0 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
151f0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
15200 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15210 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15220 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
15230 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
15240 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
15250 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
15260 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
15270 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
15280 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
15290 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
152a0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
152b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
152c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
152d0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
152e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
152f0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
15300 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
15310 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
15320 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
15330 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73  xFile*)id;.    s
15340 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  emUnlock(id, NO_
15350 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
15360 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
15370 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
15380 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
15390 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
153a0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
153b0 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
153c0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
153d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
153e0 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
153f0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
15400 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
15410 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
15420 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
15430 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
15440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
15450 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
15460 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
15470 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
15480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
15490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
154e0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
154f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
15530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
15550 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
15560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
15580 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
15590 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
155a0 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
155b0 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
155c0 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
155d0 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
155e0 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
155f0 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
15600 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
15610 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
15620 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
15630 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
15640 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
15650 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
15660 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
15670 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
15680 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
15690 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
156a0 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
156b0 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
156c0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
156d0 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
156e0 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
156f0 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
15700 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
15710 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
15720 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
15730 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
15740 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
15750 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
15760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
15770 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
15780 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
15790 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
157a0 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
157b0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
157c0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
157d0 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
157e0 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
157f0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
15800 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
15810 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
15820 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
15830 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
15840 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
15850 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
15860 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
15870 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
15880 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
15890 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
158a0 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
158b0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
158c0 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
158d0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
158e0 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
158f0 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
15900 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
15930 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
15940 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
15950 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
15960 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
15970 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
15980 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
15990 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
159a0 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
159b0 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
159c0 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
159d0 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
159e0 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
159f0 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
15a00 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
15a10 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15a20 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
15a30 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
15a40 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
15a50 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
15a60 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
15a70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
15a80 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
15a90 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
15aa0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
15ab0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
15ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
15ad0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
15ae0 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
15af0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15b00 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
15b10 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
15b20 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
15b30 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15b40 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
15b50 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15b60 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
15b70 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
15b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15b90 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
15ba0 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
15bb0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
15bc0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
15bd0 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
15be0 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
15bf0 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
15c00 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
15c10 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
15c20 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
15c30 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
15c40 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
15c50 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
15c60 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
15c70 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
15c80 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
15c90 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
15ca0 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
15cb0 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
15cc0 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
15cd0 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
15ce0 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
15cf0 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
15d00 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
15d10 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
15d20 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
15d30 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
15d40 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
15d50 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
15d60 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
15d70 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
15d80 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
15d90 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
15da0 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
15db0 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
15dc0 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
15dd0 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
15de0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
15df0 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
15e00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15e10 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
15e20 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15e30 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15e40 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15e50 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
15e60 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
15e70 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
15e80 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
15e90 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
15ea0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
15eb0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
15ec0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
15ed0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
15ee0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15ef0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
15f00 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
15f10 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
15f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15f30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
15f40 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
15f50 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
15f60 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
15f70 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
15f80 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
15f90 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
15fa0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
15fb0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
15fc0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
15fd0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
15fe0 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
15ff0 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
16000 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
16010 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
16020 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
16030 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
16040 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
16050 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
16060 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
16070 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
16080 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
16090 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
160a0 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
160b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
160c0 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
160d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
160e0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
160f0 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
16100 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
16110 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
16120 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
16130 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
16140 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
16150 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
16160 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78  File );.  contex
16170 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
16180 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
16190 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
161a0 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e  .  if( context->
161b0 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
161c0 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20  *pResOut = 1;.  
161d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
161e0 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
161f0 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
16200 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
16210 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
16220 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
16230 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
16240 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
16250 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
16260 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
16270 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
16280 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
16290 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
162a0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
162b0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
162c0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
162d0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
162e0 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a  holds it..   */.
162f0 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
16300 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74  ){.    /* lock t
16310 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65  he RESERVED byte
16320 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
16330 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16340 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16350 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
16360 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20  TE, 1,1);  .    
16370 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c  if( SQLITE_OK==l
16380 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  rc ){.      /* i
16390 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
163a0 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73  n taking the res
163b0 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  erved lock, unlo
163c0 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  ck it to restore
163d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
163e0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a  iginal state */.
163f0 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53        lrc = afpS
16400 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16410 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
16420 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
16430 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20   0);.    } else 
16440 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
16450 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74   failed to get t
16460 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d  he lock then som
16470 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68  eone else must h
16480 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ave it */.      
16490 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
164a0 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
164b0 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
164c0 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a  {.      rc=lrc;.
164d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
164e0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
164f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
16500 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
16510 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
16520 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
16530 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65  ved));.  .  *pRe
16540 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
16550 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16560 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
16570 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
16580 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
16590 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
165a0 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
165b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
165c0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
165d0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
165e0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
165f0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
16600 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
16610 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
16620 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
16630 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
16640 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
16650 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
16660 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
16670 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
16680 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
16690 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
166a0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
166b0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
166c0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
166d0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
166e0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
166f0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
16700 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
16710 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
16720 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
16730 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
16740 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
16750 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
16760 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
16770 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
16780 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
16790 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
167a0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
167b0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
167c0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
167d0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
167e0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
167f0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
16800 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
16810 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
16820 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
16830 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
16840 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
16850 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
16860 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
16870 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
16880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16890 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
168a0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
168b0 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  ileLock){.  int 
168c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
168d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
168e0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
168f0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
16900 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
16910 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66  le->pInode;.  af
16920 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16930 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
16940 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
16950 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
16960 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
16970 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
16980 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
16990 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
169a0 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
169b0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
169c0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
169d0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
169e0 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
169f0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
16a00 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16a10 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
16a20 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
16a30 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74  e->nShared , get
16a40 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  pid()));..  /* I
16a50 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
16a60 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
16a70 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
16a80 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
16a90 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
16aa0 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
16ab0 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
16ac0 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
16ad0 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
16ae0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
16af0 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
16b00 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
16b10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16b20 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
16b30 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
16b40 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
16b50 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
16b60 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16b70 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16b80 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
16b90 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
16ba0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
16bb0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
16bc0 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
16bd0 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
16be0 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
16bf0 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
16c00 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
16c10 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
16c20 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
16c30 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
16c40 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
16c50 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
16c60 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
16c70 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
16c80 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
16c90 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
16ca0 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
16cb0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
16cc0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
16cd0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
16ce0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
16d00 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
16d10 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16d20 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
16d30 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
16d40 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
16d50 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16d60 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
16d70 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
16d80 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
16d90 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
16da0 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
16db0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
16dc0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
16dd0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
16de0 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
16df0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
16e00 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
16e10 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
16e20 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
16e30 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
16e40 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
16e50 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
16e60 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
16e70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
16e80 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
16e90 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70  ck && .       (p
16ea0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16eb0 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
16ec0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
16ed0 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29  ED_LOCK)).     )
16ee0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
16ef0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
16f00 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
16f10 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20   }.  .  /* If a 
16f20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
16f30 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
16f40 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
16f50 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
16f60 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
16f70 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
16f80 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
16f90 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
16fa0 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
16fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
16fc0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
16fd0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16fe0 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f  K && .     (pIno
16ff0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
17000 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
17010 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
17020 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
17030 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
17040 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17050 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
17060 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
17070 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
17080 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17090 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
170a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
170b0 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
170c0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
170d0 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
170e0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
170f0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
17100 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f  ck;.  }.    .  /
17110 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
17120 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
17130 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
17140 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
17150 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
17160 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
17170 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
17180 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
17190 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
171a0 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
171b0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
171c0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
171d0 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
171e0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
171f0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
17200 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
17210 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
17220 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
17230 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
17240 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17250 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
17260 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
17270 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
17280 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
17290 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
172a0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
172b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
172c0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
172d0 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
172e0 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
172f0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
17300 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
17310 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
17320 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
17330 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
17340 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
17350 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
17360 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  nt lrc1, lrc2, l
17370 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  rc1Errno = 0;.  
17380 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
17390 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
173a0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
173b0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
173c0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
173d0 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
173e0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
173f0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
17400 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
17410 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
17420 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
17430 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
17440 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
17450 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
17460 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
17470 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
17480 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
17490 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
174a0 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
174b0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
174c0 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
174d0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
174e0 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
174f0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17500 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17510 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
17520 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
17530 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
17540 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
17550 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
17560 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
17570 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
17580 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
17590 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
175a0 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
175b0 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
175c0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
175d0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
175e0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
175f0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
17600 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
17610 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
17620 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
17630 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e  Errno = lrc1Errn
17640 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  o;.      rc = lr
17650 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c1;.      goto a
17660 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
17670 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c   } else if( IS_L
17680 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20  OCK_ERROR(lrc2) 
17690 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  ){.      rc = lr
176a0 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c2;.      goto a
176b0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
176c0 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31   } else if( lrc1
176d0 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20   != SQLITE_OK ) 
176e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
176f0 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  1;.    } else {.
17700 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
17710 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
17720 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
17730 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
17740 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
17750 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
17760 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
17770 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
17780 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
17790 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
177a0 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
177b0 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
177c0 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
177d0 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
177e0 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  s.     ** same p
177f0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
17800 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
17810 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
17820 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
17830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
17840 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
17850 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
17860 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
17870 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
17880 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
17890 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
178a0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
178b0 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
178c0 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
178d0 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  /.    int failed
178e0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
178f0 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
17900 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20  eLock );.    if 
17910 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45  (eFileLock >= RE
17920 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
17930 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17940 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  < RESERVED_LOCK)
17950 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63   {.        /* Ac
17960 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
17970 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
17980 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
17990 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
179a0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
179b0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
179c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69  ;.      if( !fai
179d0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63  led ){.        c
179e0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
179f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
17a00 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69    }.    if (!fai
17a10 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  led && eFileLock
17a20 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   == EXCLUSIVE_LO
17a30 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41  CK) {.      /* A
17a40 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
17a50 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  IVE lock */.    
17a60 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65      .      /* Re
17a70 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20  move the shared 
17a80 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69  lock before tryi
17a90 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77  ng the range.  w
17aa0 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20  e'll need to .  
17ab0 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69      ** reestabli
17ac0 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
17ad0 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67  ck if we can't g
17ae0 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63  et the  afpUnloc
17af0 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  k.      */.     
17b00 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20   if( !(failed = 
17b10 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17b20 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17b30 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  e, SHARED_FIRST 
17b40 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
17b50 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64             pInod
17b60 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
17b70 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 0)) ){.       
17b80 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53   int failed2 = S
17b90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
17ba0 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
17bb0 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
17bc0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
17bd0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
17be0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
17bf0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17c00 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
17c10 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c30 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
17c40 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
17c50 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
17c60 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c  ailed2 = afpSetL
17c70 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17c80 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
17cb0 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65   + pInode->share
17cc0 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b  dByte, 1, 1)) ){
17cd0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
17ce0 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20  n't reestablish 
17cf0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  the shared lock.
17d00 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64    Sqlite can't d
17d10 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20  eal, this is.   
17d20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74         ** a crit
17d30 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20  ical I/O error. 
17d40 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
17d50 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69        rc = ((fai
17d60 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  led & SQLITE_IOE
17d70 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
17d80 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a  ERR) ? failed2 :
17d90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17da0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
17db0 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  CK;.          go
17dc0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
17dd0 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
17de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17df0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20   rc = failed; . 
17e00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17e10 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20   if( failed ){. 
17e20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
17e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
17e40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17e50 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
17e60 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17e70 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
17e80 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
17e90 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
17ea0 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
17eb0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
17ec0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
17ed0 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
17ee0 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
17ef0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
17f00 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
17f10 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f   }.  .afp_end_lo
17f20 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
17f30 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
17f40 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
17f50 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70  s %s (afp)\n", p
17f60 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
17f70 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
17f80 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
17f90 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
17fa0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
17fb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17fc0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
17fd0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
17fe0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
17ff0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
18000 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
18010 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
18020 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
18030 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
18040 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
18050 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
18060 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
18070 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
18080 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
18090 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
180a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
180b0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
180c0 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b  ic int afpUnlock
180d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
180e0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
180f0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
18100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
18110 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
18120 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
18130 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
18140 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
18150 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
18160 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
18170 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
18180 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
18190 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72  ;.  int skipShar
181a0 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
181b0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
181c0 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23   h = pFile->h;.#
181d0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
181e0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
181f0 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
18200 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
18210 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
18220 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
18230 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
18240 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
18250 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
18260 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
18270 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
18280 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20  hared,.         
18290 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
182a0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
182b0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
182c0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
182d0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
182e0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
182f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18300 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
18310 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
18320 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
18330 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
18340 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
18350 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
18360 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
18370 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
18380 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
18390 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
183a0 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d  eLock );.    Sim
183b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
183c0 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c  gn(1);.    Simul
183d0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
183e0 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74  1) ).    Simulat
183f0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
18400 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53  );.    .#ifdef S
18410 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
18420 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
18430 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
18440 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
18450 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
18460 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
18470 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
18480 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
18490 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
184a0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
184b0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
184c0 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
184d0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
184e0 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
184f0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
18500 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
18510 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
18520 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
18530 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
18540 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
18550 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
18560 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
18570 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
18580 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
18590 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
185a0 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
185b0 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
185c0 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
185d0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
185e0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
185f0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
18600 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
18610 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
18620 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74  | pFile->dbUpdat
18630 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
18640 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43  || pFile->transC
18650 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20  ntrChng==1 );.  
18660 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
18670 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
18680 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  if.    .    if( 
18690 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
186a0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
186b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
186c0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
186d0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
186e0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
186f0 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
18700 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
18710 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
18720 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
18730 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
18740 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20  Shared>1) ){.   
18750 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d       /* only re-
18760 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
18770 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63  ared lock if nec
18780 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20  essary */.      
18790 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b    int sharedLock
187a0 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
187b0 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
187c0 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20  edByte;.        
187d0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
187e0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
187f0 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
18800 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  ckByte, 1, 1);. 
18810 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
18820 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64        skipShared
18830 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
18840 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
18850 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
18860 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  le->eFileLock>=P
18870 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
18880 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
18890 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
188a0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
188b0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
188c0 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28  ;.    } .    if(
188d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
188e0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
188f0 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
18900 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65  K && context->re
18910 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20  served ){.      
18920 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18930 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18940 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
18950 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
18960 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a      if( !rc ){ .
18970 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
18980 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a  >reserved = 0; .
18990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
189a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
189b0 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
189c0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
189d0 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
189e0 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e  d>1)){.      pIn
189f0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
18a00 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
18a10 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
18a20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
18a30 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
18a40 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  K ){..    /* Dec
18a50 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
18a60 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
18a70 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
18a80 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
18a90 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
18aa0 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
18ab0 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
18ac0 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
18ad0 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
18ae0 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ck..    */.    u
18af0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
18b00 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  g sharedLockByte
18b10 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
18b20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
18b30 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  te;.    pInode->
18b40 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
18b50 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
18b60 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ed==0 ){.      S
18b70 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18b80 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53  nign(1);.      S
18b90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18ba0 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53  h=(-1) ).      S
18bb0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18bc0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
18bd0 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29  f( !skipShared )
18be0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  {.        rc = a
18bf0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
18c00 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18c10 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
18c20 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
18c30 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29  .      if( !rc )
18c40 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
18c50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
18c60 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
18c70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18c80 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
18c90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
18ca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18cb0 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
18cc0 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61  nLock--;.      a
18cd0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
18ce0 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Lock>=0 );.     
18cf0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
18d00 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
18d10 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
18d20 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  (pFile);.      }
18d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
18d40 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
18d50 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18d60 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
18d70 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
18d80 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
18d90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
18da0 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e  e a file & clean
18db0 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20  up AFP specific 
18dc0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
18dd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
18de0 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  fpClose(sqlite3_
18df0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
18e00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18e10 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
18e20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18e30 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
18e40 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b  d;.    afpUnlock
18e50 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
18e60 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
18e70 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
18e80 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46  le->pInode && pF
18e90 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
18ea0 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ck ){.      /* I
18eb0 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
18ec0 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
18ed0 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
18ee0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
18ef0 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20  st.      ** yet 
18f00 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
18f10 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
18f20 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
18f30 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
18f40 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
18f50 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e   to pInode->aPen
18f60 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62  ding.  It will b
18f70 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
18f80 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20  closed when.    
18f90 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
18fa0 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
18fb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65       */.      se
18fc0 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
18fd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
18fe0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
18ff0 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ile);.    sqlite
19000 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
19010 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
19020 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
19030 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
19040 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
19050 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19060 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
19070 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
19080 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
19090 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
190a0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
190b0 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
190c0 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
190d0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
190e0 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
190f0 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
19100 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
19110 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
19120 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
19130 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
19140 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
19150 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
19160 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
19170 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
19180 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
19190 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
191a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
191b0 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
191c0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
191d0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
191e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
191f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19230 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
19240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19280 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
19290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192a0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20  ***** Begin NFS 
192b0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
192c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192d0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64  ********/..#if d
192e0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
192f0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
19300 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
19310 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
19320 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
19330 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
19340 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
19350 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
19360 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  k. ** must be ei
19370 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
19380 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
19390 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
193a0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
193b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
193c0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
193d0 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
193e0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
193f0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
19400 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
19410 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
19420 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
19430 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
19440 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72   eFileLock){.  r
19450 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63  eturn posixUnloc
19460 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  k(id, eFileLock,
19470 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   1);.}..#endif /
19480 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
19490 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
194a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
194b0 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
194c0 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
194d0 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c  he NFS lock impl
194e0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
194f0 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
19500 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
19510 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
19520 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
19530 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
19540 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
19550 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a  available.  .**.
19560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19570 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
19580 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   NFS lock implem
19590 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
195a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
195b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
19600 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
19610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19650 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
19660 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71  * Non-locking sq
19670 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
19680 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
19690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
196b0 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
196c0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
196d0 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64  s for all method
196e0 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c  s of the .** sql
196f0 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74  ite3_file object
19700 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
19710 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e  locking methods.
19720 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a    The locking.**
19730 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65   methods were de
19740 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f  fined in divisio
19750 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f  ns above (one lo
19760 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72  cking method per
19770 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20  .** division).  
19780 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68  Those methods th
19790 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f  at are common to
197a0 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64   all locking mod
197b0 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72  es.** are gather
197c0 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74   together into t
197d0 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  his division..*/
197e0 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
197f0 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65  the offset passe
19800 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
19810 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72  argument, then r
19820 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65  ead cnt .** byte
19830 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74  s into pBuf. Ret
19840 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19850 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
19860 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a   read..**.** NB:
19870 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20    If you define 
19880 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45  USE_PREAD or USE
19890 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69  _PREAD64, then i
198a0 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20  t might also.** 
198b0 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
198c0 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
198d0 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20  URCE to be 500. 
198e0 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f   This varies fro
198f0 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20  m.** one system 
19900 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e  to another.  Sin
19910 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e  ce SQLite does n
19920 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ot define USE_PR
19930 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66  EAD.** any any f
19940 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20  orm by default, 
19950 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  we will not atte
19960 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  mpt to define _X
19970 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20  OPEN_SOURCE..** 
19980 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34  See tickets #274
19990 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a  1 and #2681..**.
199a0 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
199b0 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
199c0 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
199d0 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72   read the lastEr
199e0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
199f0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
19a00 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
19a10 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28  int seekAndRead(
19a20 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71  unixFile *id, sq
19a30 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
19a40 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  et, void *pBuf, 
19a50 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
19a60 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72  got;.  int prior
19a70 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69   = 0;.#if (!defi
19a80 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
19a90 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
19aa0 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
19ab0 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
19ac0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
19ad0 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28    assert( cnt==(
19ae0 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a  cnt&0x1ffff) );.
19af0 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e    assert( id->h>
19b00 32 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78  2 );.  cnt &= 0x
19b10 31 66 66 66 66 3b 0a 20 20 64 6f 7b 0a 23 69 66  1ffff;.  do{.#if
19b20 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19b30 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  AD).    got = os
19b40 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
19b50 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
19b60 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
19b70 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
19b80 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
19b90 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20  USE_PREAD64).   
19ba0 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
19bb0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19bc0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
19bd0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19be0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
19bf0 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  se.    newOffset
19c00 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
19c10 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
19c20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
19c30 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
19c40 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  t-- );.    if( n
19c50 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
19c60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
19c70 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
19c80 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46  .        ((unixF
19c90 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
19ca0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
19cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19cc0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
19cd0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
19ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19cf0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
19d00 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61  .    got = osRea
19d10 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
19d20 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nt);.#endif.    
19d30 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62  if( got==cnt ) b
19d40 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f  reak;.    if( go
19d50 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  t<0 ){.      if(
19d60 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b   errno==EINTR ){
19d70 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e   got = 1; contin
19d80 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f  ue; }.      prio
19d90 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 28 28 75  r = 0;.      ((u
19da0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
19db0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
19dc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19dd0 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e    }else if( got>
19de0 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d  0 ){.      cnt -
19df0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66  = got;.      off
19e00 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  set += got;.    
19e10 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a    prior += got;.
19e20 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f        pBuf = (vo
19e30 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72  id*)(got + (char
19e40 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  *)pBuf);.    }. 
19e50 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29   }while( got>0 )
19e60 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
19e70 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
19e80 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
19e90 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20  d %llu\n",.     
19ea0 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f         id->h, go
19eb0 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d  t+prior, offset-
19ec0 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41  prior, TIMER_ELA
19ed0 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
19ee0 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f   got+prior;.}../
19ef0 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
19f00 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
19f10 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
19f20 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
19f30 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
19f40 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
19f50 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
19f60 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
19f70 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
19f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
19f90 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
19fa0 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
19fb0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
19fc0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
19fd0 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
19fe0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
19ff0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1a000 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
1a010 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
1a020 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
1a030 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a040 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
1a050 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
1a060 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
1a070 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
1a080 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
1a090 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
1a0a0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
1a0b0 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
1a0c0 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
1a0d0 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
1a0e0 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
1a0f0 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
1a100 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
1a110 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
1a120 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
1a130 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
1a140 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
1a150 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 46 69 6c  ndif..  if( pFil
1a160 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
1a170 4e 49 58 46 49 4c 45 5f 44 45 46 45 52 52 45 44  NIXFILE_DEFERRED
1a180 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1a190 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73      if( osAccess
1a1a0 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 46  (pFile->zPath, F
1a1b0 5f 4f 4b 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45  _OK) && errno==E
1a1c0 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 6d  NOENT ){.      m
1a1d0 65 6d 73 65 74 28 70 42 75 66 2c 20 30 2c 20 61  emset(pBuf, 0, a
1a1e0 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mt);.      rc = 
1a1f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1a200 52 54 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c  RT_READ;.    }el
1a210 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75  se{.      rc = u
1a220 6e 69 78 4f 70 65 6e 28 70 46 69 6c 65 2d 3e 70  nixOpen(pFile->p
1a230 56 66 73 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  Vfs, pFile->zPat
1a240 68 2c 20 69 64 2c 20 70 46 69 6c 65 2d 3e 6f 70  h, id, pFile->op
1a250 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
1a260 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1a270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a280 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a290 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1a2a0 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
1a2b0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
1a2c0 46 45 52 52 45 44 29 3d 3d 30 20 29 3b 0a 0a 23  FERRED)==0 );..#
1a2d0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1a2e0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44  AP_SIZE>0.  /* D
1a2f0 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
1a300 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72 65   of this read re
1a310 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
1a320 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
1a330 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
1a340 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
1a350 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
1a360 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
1a370 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
1a380 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
1a390 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
1a3a0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1a3b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
1a3c0 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
1a3d0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1a3e0 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20  offset], amt);. 
1a3f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1a400 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1a410 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  {.      int nCop
1a420 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  y = pFile->mmapS
1a430 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
1a440 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1a450 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
1a460 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1a470 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20  fset], nCopy);. 
1a480 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
1a490 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
1a4a0 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
1a4b0 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
1a4c0 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
1a4d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1a4e0 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
1a4f0 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  ad(pFile, offset
1a500 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
1a510 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
1a520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a530 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
1a540 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f  ( got<0 ){.    /
1a550 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
1a560 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
1a570 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1a580 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
1a590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
1a5a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1a5b0 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
1a5c0 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1a5d0 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
1a5e0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
1a5f0 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
1a600 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
1a610 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
1a620 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
1a630 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1a640 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1a650 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
1a660 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
1a670 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65 73 63  ek the file-desc
1a680 72 69 70 74 6f 72 20 70 61 73 73 65 64 20 61 73  riptor passed as
1a690 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1a6a0 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75  ent to.** absolu
1a6b0 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66 2c 20  te offset iOff, 
1a6c0 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  then attempt to 
1a6d0 77 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  write nBuf bytes
1a6e0 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a   of data from.**
1a6f0 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49 66 20   pBuf to it. If 
1a700 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1a710 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 73   return -1 and s
1a720 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68  et *piErrno. Oth
1a730 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75  erwise, .** retu
1a740 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75  rn the actual nu
1a750 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
1a760 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d 61 79  itten (which may
1a770 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a   be less than.**
1a780 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69   nBuf)..*/.stati
1a790 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1a7a0 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64 2c 20  teFd(.  int fd, 
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1a7d0 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 77 72  descriptor to wr
1a7e0 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
1a7f0 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20 20  iOff,           
1a800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a810 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65  ile offset to be
1a820 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
1a830 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1a840 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
1a850 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1a860 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65   from this buffe
1a870 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  r to the file */
1a880 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 20 20  .  int nBuf,    
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
1a8b0 66 66 65 72 20 70 42 75 66 20 69 6e 20 62 79 74  ffer pBuf in byt
1a8c0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45  es */.  int *piE
1a8d0 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  rrno            
1a8e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1a8f0 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69 66 20  Error number if 
1a900 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a  error occurs */.
1a910 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a930 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1a940 74 75 72 6e 65 64 20 62 79 20 73 79 73 74 65 6d  turned by system
1a950 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   call */..  asse
1a960 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26  rt( nBuf==(nBuf&
1a970 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73  0x1ffff) );.  as
1a980 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a 20 20  sert( fd>2 );.  
1a990 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b  nBuf &= 0x1ffff;
1a9a0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
1a9b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
1a9c0 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63  _PREAD).  do{ rc
1a9d0 20 3d 20 6f 73 50 77 72 69 74 65 28 66 64 2c 20   = osPwrite(fd, 
1a9e0 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66  pBuf, nBuf, iOff
1a9f0 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
1aa00 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
1aa10 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1aa20 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
1aa30 64 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72 69 74  do{ rc = osPwrit
1aa40 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e 42  e64(fd, pBuf, nB
1aa50 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65  uf, iOff);}while
1aa60 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
1aa70 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20  =EINTR);.#else. 
1aa80 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53 65   do{.    i64 iSe
1aa90 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69  ek = lseek(fd, i
1aaa0 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  Off, SEEK_SET);.
1aab0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1aac0 72 6f 72 28 20 69 53 65 65 6b 2d 2d 20 29 3b 0a  ror( iSeek-- );.
1aad0 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b 21 3d  .    if( iSeek!=
1aae0 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 69 66  iOff ){.      if
1aaf0 28 20 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45  ( piErrno ) *piE
1ab00 72 72 6e 6f 20 3d 20 28 69 53 65 65 6b 3d 3d 2d  rrno = (iSeek==-
1ab10 31 20 3f 20 65 72 72 6e 6f 20 3a 20 30 29 3b 0a  1 ? errno : 0);.
1ab20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1ab30 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1ab40 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42 75 66  osWrite(fd, pBuf
1ab50 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c  , nBuf);.  }whil
1ab60 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
1ab70 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69  ==EINTR );.#endi
1ab80 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  f..  TIMER_END;.
1ab90 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
1aba0 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c  E   %-3d %5d %7l
1abb0 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20  ld %llu\n", fd, 
1abc0 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f  rc, iOff, TIMER_
1abd0 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20 69 66  ELAPSED));..  if
1abe0 28 20 72 63 3c 30 20 26 26 20 70 69 45 72 72 6e  ( rc<0 && piErrn
1abf0 6f 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65  o ) *piErrno = e
1ac00 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72  rrno;.  return r
1ac10 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  c;.}.../*.** See
1ac20 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
1ac30 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68  in id->offset th
1ac40 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65  en read cnt byte
1ac50 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20  s into pBuf..** 
1ac60 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1ac70 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
1ac80 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74  lly read.  Updat
1ac90 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a  e the offset..**
1aca0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
1acb0 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
1acc0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
1acd0 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74  d write the last
1ace0 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
1acf0 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
1ad00 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1ad10 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1ad20 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  te(unixFile *id,
1ad30 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e   i64 offset, con
1ad40 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
1ad50 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72  nt cnt){.  retur
1ad60 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64  n seekAndWriteFd
1ad70 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
1ad80 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e  pBuf, cnt, &id->
1ad90 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a  lastErrno);.}...
1ada0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1adb0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
1adc0 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
1add0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1ade0 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
1adf0 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1ae00 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
1ae10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1ae20 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69  nixWrite(.  sqli
1ae30 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
1ae40 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1ae50 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
1ae60 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1ae70 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78  ffset .){.  unix
1ae80 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1ae90 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1aea0 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
1aeb0 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1aec0 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
1aed0 0a 0a 20 20 2f 2a 20 53 51 4c 69 74 65 20 6e 65  ..  /* SQLite ne
1aee0 76 65 72 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  ver actually cal
1aef0 6c 73 20 78 57 72 69 74 65 20 6f 6e 20 61 6e 20  ls xWrite on an 
1af00 65 6d 70 74 79 20 66 69 6c 65 20 62 65 66 6f 72  empty file befor
1af10 65 20 6f 62 74 61 69 6e 69 6e 67 0a 20 20 2a 2a  e obtaining.  **
1af20 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1af30 20 6f 6e 20 69 74 2e 20 53 6f 20 74 68 65 20 66   on it. So the f
1af40 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69  ollowing conditi
1af50 6f 6e 20 69 73 20 6e 65 76 65 72 20 74 72 75 65  on is never true
1af60 20 69 66 20 0a 20 20 2a 2a 20 74 68 65 20 56 46   if .  ** the VF
1af70 53 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  S is being used 
1af80 64 69 72 65 63 74 6c 79 20 62 79 20 53 51 4c 69  directly by SQLi
1af90 74 65 2e 20 42 75 74 20 69 74 20 6d 61 79 20 62  te. But it may b
1afa0 65 20 69 66 20 74 68 69 73 20 6d 6f 64 75 6c 65  e if this module
1afb0 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 75  .  ** is being u
1afc0 73 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  sed in some othe
1afd0 72 20 77 61 79 2e 20 42 79 20 74 68 65 20 6d 75  r way. By the mu
1afe0 6c 74 69 70 6c 65 78 6f 72 20 56 46 53 2c 20 66  ltiplexor VFS, f
1aff0 6f 72 20 65 78 61 6d 70 6c 65 2e 20 2a 2f 0a 20  or example. */. 
1b000 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
1b010 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
1b020 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
1b030 20 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4f 70   int rc = unixOp
1b040 65 6e 41 6e 64 4c 6f 63 6b 28 70 46 69 6c 65 29  enAndLock(pFile)
1b050 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b060 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1b070 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
1b080 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
1b090 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
1b0a0 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
1b0b0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
1b0c0 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
1b0d0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
1b0e0 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
1b0f0 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
1b100 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
1b110 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
1b120 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
1b130 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
1b140 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
1b150 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
1b160 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
1b170 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
1b180 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1b190 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49  ITE_DEBUG.  /* I
1b1a0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1b1b0 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1b1c0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1b1d0 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1b1e0 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74    ** doing a hot
1b1f0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1b200 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20  k or a write to 
1b210 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20  some file other 
1b220 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d  than a.  ** norm
1b230 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1b240 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68  ) then record th
1b250 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
1b260 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61  database.  ** ha
1b270 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  s changed.  If t
1b280 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1b290 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69  ounter is modifi
1b2a0 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a  ed, record that.
1b2b0 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20    ** fact too.. 
1b2c0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
1b2d0 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29  >inNormalWrite )
1b2e0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  {.    pFile->dbU
1b2f0 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54  pdate = 1;  /* T
1b300 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
1b310 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f  been modified */
1b320 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c  .    if( offset<
1b330 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d  =24 && offset+am
1b340 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69  t>=27 ){.      i
1b350 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61  nt rc;.      cha
1b360 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20  r oldCntr[4];.  
1b370 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1b380 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1b390 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64      rc = seekAnd
1b3a0 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20  Read(pFile, 24, 
1b3b0 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20  oldCntr, 4);.   
1b3c0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1b3d0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1b3e0 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20     if( rc!=4 || 
1b3f0 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20  memcmp(oldCntr, 
1b400 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32  &((char*)pBuf)[2
1b410 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30  4-offset], 4)!=0
1b420 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1b430 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
1b440 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72   = 1;  /* The tr
1b450 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1b460 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f  r has changed */
1b470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b480 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53   }.#endif..#if S
1b490 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1b4a0 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
1b4b0 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
1b4c0 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65  this write reque
1b4d0 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
1b4e0 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
1b4f0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
1b500 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
1b510 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
1b520 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
1b530 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
1b540 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
1b550 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
1b560 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1b570 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
1b580 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1b590 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1b5a0 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20  pBuf, amt);.    
1b5b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b5c0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
1b5d0 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
1b5e0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1b5f0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
1b600 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1b610 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1b620 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1b630 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  uf, nCopy);.    
1b640 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
1b650 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
1b660 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
1b670 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
1b680 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
1b690 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68    }.#endif..  wh
1b6a0 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77  ile( amt>0 && (w
1b6b0 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rote = seekAndWr
1b6c0 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ite(pFile, offse
1b6d0 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30  t, pBuf, amt))>0
1b6e0 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
1b6f0 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74  rote;.    offset
1b700 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   += wrote;.    p
1b710 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
1b720 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
1b730 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1b740 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c  or(( wrote=(-1),
1b750 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d   amt=1 ));.  Sim
1b760 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
1b770 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d  or(( wrote=0, am
1b780 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61  t=1 ));..  if( a
1b790 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  mt>0 ){.    if( 
1b7a0 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65  wrote<0 && pFile
1b7b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f  ->lastErrno!=ENO
1b7c0 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  SPC ){.      /* 
1b7d0 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
1b7e0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f   seekAndWrite */
1b7f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b800 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1b810 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b820 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1b830 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
1b840 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
1b850 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1b860 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1b870 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1b880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1b890 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1b8a0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1b8b0 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
1b8c0 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
1b8d0 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
1b8e0 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
1b8f0 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
1b900 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
1b910 75 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  urring at the ri
1b920 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
1b930 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
1b940 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
1b950 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1b960 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
1b970 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f  ../*.** We do no
1b980 74 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20  t trust systems 
1b990 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72  to provide a wor
1b9a0 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29  king fdatasync()
1b9b0 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f  .  Some do..** O
1b9c0 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f  thers do no.  To
1b9d0 20 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c   be safe, we wil
1b9e0 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65  l stick with the
1b9f0 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65   (slightly slowe
1ba00 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49  r).** fsync(). I
1ba10 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20  f you know that 
1ba20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73  your system does
1ba30 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79   support fdatasy
1ba40 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a  nc() correctly,.
1ba50 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63  ** then simply c
1ba60 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64  ompile with -Dfd
1ba70 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e  atasync=fdatasyn
1ba80 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  c.*/.#if !define
1ba90 64 28 66 64 61 74 61 73 79 6e 63 29 0a 23 20 64  d(fdatasync).# d
1baa0 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20  efine fdatasync 
1bab0 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a  fsync.#endif../*
1bac0 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f  .** Define HAVE_
1bad0 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f  FULLFSYNC to 0 o
1bae0 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 1 depending on
1baf0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
1bb00 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59  ** the F_FULLFSY
1bb10 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  NC macro is defi
1bb20 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e  ned.  F_FULLFSYN
1bb30 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  C is currently.*
1bb40 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  * only available
1bb50 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42   on Mac OS X.  B
1bb60 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68  ut that could ch
1bb70 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ange..*/.#ifdef 
1bb80 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65  F_FULLFSYNC.# de
1bb90 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1bba0 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65  YNC 1.#else.# de
1bbb0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1bbc0 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  YNC 0.#endif.../
1bbd0 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29  *.** The fsync()
1bbe0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65   system call doe
1bbf0 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64  s not work as ad
1bc00 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79  vertised on many
1bc10 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73  .** unix systems
1bc20 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1bc30 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e   procedure is an
1bc40 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65   attempt to make
1bc50 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74  .** it work bett
1bc60 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  er..**.** The SQ
1bc70 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63  LITE_NO_SYNC mac
1bc80 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20  ro disables all 
1bc90 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20  fsync()s.  This 
1bca0 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  is useful.** for
1bcb0 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65   testing when we
1bcc0 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72   want to run thr
1bcd0 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75  ough the test su
1bce0 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20  ite quickly..** 
1bcf0 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79  You are strongly
1bd00 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74   advised *not* t
1bd10 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51  o deploy with SQ
1bd20 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20  LITE_NO_SYNC.** 
1bd30 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72  enabled, however
1bd40 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c  , since with SQL
1bd50 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62  ITE_NO_SYNC enab
1bd60 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68  led, an OS crash
1bd70 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
1bd80 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  lure will likely
1bd90 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74   corrupt the dat
1bda0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1bdb0 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68  * SQLite sets th
1bdc0 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20  e dataOnly flag 
1bdd0 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  if the size of t
1bde0 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61  he file is uncha
1bdf0 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65  nged..** The ide
1be00 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c  a behind dataOnl
1be10 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f  y is that it sho
1be20 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  uld only write t
1be30 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a  he file content.
1be40 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20  ** to disk, not 
1be50 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f  the inode.  We o
1be60 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79  nly set dataOnly
1be70 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a   if the file siz
1be80 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  e is .** unchang
1be90 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c  ed since the fil
1bea0 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f  e size is part o
1beb0 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f  f the inode.  Ho
1bec0 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54  wever, .** Ted T
1bed0 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61  s'o tells us tha
1bee0 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1bef0 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68  ll also write th
1bf00 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a  e inode if the.*
1bf10 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20  * file size has 
1bf20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e  changed.  The on
1bf30 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e  ly real differen
1bf40 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61  ce between fdata
1bf50 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73  sync().** and fs
1bf60 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73  ync(), Ted tells
1bf70 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61   us, is that fda
1bf80 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f  tasync() will no
1bf90 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69  t flush the.** i
1bfa0 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d  node if the mtim
1bfb0 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74  e or owner or ot
1bfc0 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62  her inode attrib
1bfd0 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  utes have change
1bfe0 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61  d..** We only ca
1bff0 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  re about the fil
1c000 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20  e size, not the 
1c010 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69  other file attri
1c020 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20  butes, so.** as 
1c030 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73  far as SQLite is
1c040 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66   concerned, an f
1c050 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c  datasync() is al
1c060 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a  ways adequate..*
1c070 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20  * So, we always 
1c080 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20  use fdatasync() 
1c090 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  if it is availab
1c0a0 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  le, regardless o
1c0b0 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  f.** the value o
1c0c0 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  f the dataOnly f
1c0d0 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lag..*/.static i
1c0e0 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e  nt full_fsync(in
1c0f0 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79  t fd, int fullSy
1c100 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  nc, int dataOnly
1c110 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1c120 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1c130 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73   "ifdef/elif/els
1c140 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68  e/" block has th
1c150 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65  e same structure
1c160 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65   as.  ** the one
1c170 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65   below. It is re
1c180 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f  plicated here so
1c190 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c  lely to avoid cl
1c1a0 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75  uttering .  ** u
1c1b0 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20  p the real code 
1c1c0 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f  with the UNUSED_
1c1d0 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72  PARAMETER() macr
1c1e0 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  os..  */.#ifdef 
1c1f0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
1c200 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1c210 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(fd);.  UNUSED_
1c220 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
1c230 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
1c240 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1c250 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  );.#elif HAVE_FU
1c260 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  LLFSYNC.  UNUSED
1c270 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1c280 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nly);.#else.  UN
1c290 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1c2a0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1c2b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1c2c0 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a  aOnly);.#endif..
1c2d0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
1c2e0 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
1c2f0 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72  that we do a nor
1c300 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20  mal fsync() and 
1c310 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20  .  ** FULLSYNC. 
1c320 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75   This is used du
1c330 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20  ring testing to 
1c340 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
1c350 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
1c360 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68  gets called with
1c370 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67   the correct arg
1c380 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66  uments..  */.#if
1c390 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1c3a0 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
1c3b0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1c3c0 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c  c_count++;.  sql
1c3d0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
1c3e0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
1c3f0 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
1c400 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
1c410 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
1c420 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
1c430 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
1c440 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1c450 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49  SYNC.  rc = SQLI
1c460 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56  TE_OK;.#elif HAV
1c470 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66  E_FULLFSYNC.  if
1c480 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ( fullSync ){.  
1c490 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66    rc = osFcntl(f
1c4a0 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  d, F_FULLFSYNC, 
1c4b0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
1c4c0 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f   rc = 1;.  }.  /
1c4d0 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59  * If the FULLFSY
1c4e0 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20  NC failed, fall 
1c4f0 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69  back to attempti
1c500 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20  ng an fsync().. 
1c510 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74   ** It shouldn't
1c520 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   be possible for
1c530 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61   fullfsync to fa
1c540 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  il on the local 
1c550 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65  .  ** file syste
1c560 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66  m (on OSX), so f
1c570 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73  ailure indicates
1c580 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a   that FULLFSYNC.
1c590 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f    ** isn't suppo
1c5a0 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69  rted for this fi
1c5b0 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61  le system. So, a
1c5c0 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20  ttempt an fsync 
1c5d0 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e  .  ** and (for n
1c5e0 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f  ow) ignore the o
1c5f0 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70  verhead of a sup
1c600 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63  erfluous fcntl c
1c610 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64  all.  .  ** It'd
1c620 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65   be better to de
1c630 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73  tect fullfsync s
1c640 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20  upport once and 
1c650 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20  avoid .  ** the 
1c660 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79  fcntl call every
1c670 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61   time sync is ca
1c680 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lled..  */.  if(
1c690 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63   rc ) rc = fsync
1c6a0 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66  (fd);..#elif def
1c6b0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1c6c0 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29    /* fdatasync()
1c6d0 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74   on HFS+ doesn't
1c6e0 20 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66   yet flush the f
1c6f0 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63  ile size if it c
1c700 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79  hanged correctly
1c710 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74  .  ** so current
1c720 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f  ly we default to
1c730 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20   the macro that 
1c740 72 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73  redefines fdatas
1c750 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a  ync to fsync.  *
1c760 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66  /.  rc = fsync(f
1c770 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20  d);.#else .  rc 
1c780 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b  = fdatasync(fd);
1c790 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1c7a0 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20    if( rc==-1 && 
1c7b0 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29  errno==ENOTSUP )
1c7c0 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63  {.    rc = fsync
1c7d0 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (fd);.  }.#endif
1c7e0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
1c7f0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  /.#endif /* ifde
1c800 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1c810 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46   elif HAVE_FULLF
1c820 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f  SYNC */..  if( O
1c830 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21  S_VXWORKS && rc!
1c840 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  = -1 ){.    rc =
1c850 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1c860 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
1c870 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
1c880 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65  ptor to the dire
1c890 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1c8a0 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e   file zFilename.
1c8b0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1c8c0 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  l, *pFd is set t
1c8d0 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
1c8e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  e descriptor and
1c8f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1c900 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1c910 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65   error occurs, e
1c920 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ither SQLITE_NOM
1c930 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  EM.** or SQLITE_
1c940 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75  CANTOPEN is retu
1c950 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73  rned and *pFd is
1c960 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66   set to an undef
1c970 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  ined.** value..*
1c980 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f  *.** The directo
1c990 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
1c9a0 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f  or is used for o
1c9b0 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20  nly one thing - 
1c9c0 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20  to.** fsync() a 
1c9d0 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b  directory to mak
1c9e0 65 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61  e sure file crea
1c9f0 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f  tion and deletio
1ca00 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20  n events.** are 
1ca10 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e  flushed to disk.
1ca20 20 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72    Such fsyncs ar
1ca30 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20  e not needed on 
1ca40 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  newer.** journal
1ca50 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c  ing filesystems,
1ca60 20 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65   but are require
1ca70 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73  d on older files
1ca80 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ystems..**.** Th
1ca90 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
1caa0 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69  e overridden usi
1cab0 6e 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61  ng the xSetSysCa
1cac0 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ll interface..**
1cad0 20 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20   The ability to 
1cae0 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f  override this ro
1caf0 75 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20  utine was added 
1cb00 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68  in support of th
1cb10 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61  e.** chromium sa
1cb20 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20  ndbox.  Opening 
1cb30 61 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61  a directory is a
1cb40 20 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28   security risk (
1cb50 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20  we are.** told) 
1cb60 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65  so making it ove
1cb70 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73  rrideable allows
1cb80 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61   the chromium sa
1cb90 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c  ndbox to.** repl
1cba0 61 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ace this routine
1cbb0 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73   with a harmless
1cbc0 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65   no-op.  To make
1cbd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1cbe0 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63   a no-op, replac
1cbf0 65 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62  e it with a stub
1cc00 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51   that returns SQ
1cc10 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
1cc20 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74  es.** *pFd set t
1cc30 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  o a negative num
1cc40 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ber..**.** If SQ
1cc50 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1cc60 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ned, the caller 
1cc70 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1cc80 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68  or closing.** th
1cc90 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1cca0 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f  r *pFd using clo
1ccb0 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se()..*/.static 
1ccc0 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
1ccd0 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
1cce0 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46  ilename, int *pF
1ccf0 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  d){.  int ii;.  
1cd00 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63  int fd = -1;.  c
1cd10 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58  har zDirname[MAX
1cd20 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20  _PATHNAME+1];.. 
1cd30 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1cd40 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
1cd50 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20  zDirname, "%s", 
1cd60 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f  zFilename);.  fo
1cd70 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e  r(ii=(int)strlen
1cd80 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31  (zDirname); ii>1
1cd90 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d   && zDirname[ii]
1cda0 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20  !='/'; ii--);.  
1cdb0 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20  if( ii>0 ){.    
1cdc0 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27  zDirname[ii] = '
1cdd0 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  \0';.    fd = ro
1cde0 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61  bust_open(zDirna
1cdf0 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
1ce00 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69  INARY, 0);.    i
1ce10 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
1ce20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
1ce30 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20  DIR %-3d %s\n", 
1ce40 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a  fd, zDirname));.
1ce50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64      }.  }.  *pFd
1ce60 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20   = fd;.  return 
1ce70 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b  (fd>=0?SQLITE_OK
1ce80 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51  :unixLogError(SQ
1ce90 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
1cea0 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72  PT, "open", zDir
1ceb0 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  name));.}../*.**
1cec0 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
1ced0 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
1cee0 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
1cef0 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
1cf00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
1cf10 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
1cf20 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
1cf30 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
1cf40 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
1cf50 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
1cf60 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
1cf70 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
1cf80 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
1cf90 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
1cfa0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
1cfb0 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
1cfc0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
1cfd0 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1cfe0 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
1cff0 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
1d000 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
1d010 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
1d020 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
1d030 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
1d040 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
1d050 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
1d060 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
1d070 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
1d080 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1d090 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
1d0a0 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
1d0b0 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
1d0c0 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
1d0d0 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
1d0e0 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
1d0f0 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
1d100 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
1d110 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1d120 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1d130 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
1d140 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
1d150 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
1d160 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
1d170 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
1d180 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
1d190 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
1d1a0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
1d1b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1d1c0 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
1d1d0 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
1d1e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1d1f0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
1d200 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
1d210 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
1d220 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
1d230 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
1d240 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
1d250 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
1d260 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
1d270 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
1d280 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
1d290 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
1d2a0 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
1d2b0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1d2c0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
1d2d0 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
1d2e0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1d2f0 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
1d300 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
1d310 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
1d320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1d330 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
1d340 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
1d350 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
1d360 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
1d370 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
1d380 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
1d390 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1d3a0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1d3b0 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
1d3c0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
1d3d0 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20  TRACE(("SYNC    
1d3e0 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
1d3f0 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  h));.  rc = full
1d400 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
1d410 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
1d420 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
1d430 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1d440 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
1d450 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
1d460 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1d470 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1d480 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1d490 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c  ERR_FSYNC, "full
1d4a0 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e  _fsync", pFile->
1d4b0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f  zPath);.  }..  /
1d4c0 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65  * Also fsync the
1d4d0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1d4e0 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69  ining the file i
1d4f0 66 20 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c  f the DIRSYNC fl
1d500 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20  ag.  ** is set. 
1d510 20 54 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74   This is a one-t
1d520 69 6d 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20  ime occurrence. 
1d530 20 4d 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65   Many systems (e
1d540 78 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20  xamples: AIX).  
1d550 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  ** are unable to
1d560 20 66 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f   fsync a directo
1d570 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72  ry, so ignore er
1d580 72 6f 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e  rors on the fsyn
1d590 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  c..  */.  if( pF
1d5a0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1d5b0 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
1d5c0 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72  C ){.    int dir
1d5d0 66 64 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  fd;.    OSTRACE(
1d5e0 28 22 44 49 52 53 59 4e 43 20 25 73 20 28 68 61  ("DIRSYNC %s (ha
1d5f0 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20  ve_fullfsync=%d 
1d600 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c  fullsync=%d)\n",
1d610 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20   pFile->zPath,. 
1d620 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f             HAVE_
1d630 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c  FULLFSYNC, isFul
1d640 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20  lsync));.    rc 
1d650 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
1d660 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  y(pFile->zPath, 
1d670 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28  &dirfd);.    if(
1d680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1d690 26 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  & dirfd>=0 ){.  
1d6a0 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64      full_fsync(d
1d6b0 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  irfd, 0, 0);.   
1d6c0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
1d6d0 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f  pFile, dirfd, __
1d6e0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c  LINE__);.    }el
1d6f0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
1d700 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
1d710 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d720 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OK;.    }.    pF
1d730 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1d740 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53  = ~UNIXFILE_DIRS
1d750 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  YNC;.  }.  retur
1d760 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d770 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
1d780 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
1d790 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
1d7a0 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63  ic int unixTrunc
1d7b0 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
1d7c0 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29   *id, i64 nByte)
1d7d0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1d7e0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
1d7f0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)id;.  int rc;.
1d800 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1d810 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1d820 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1d830 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1d840 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  TE );..  /* If t
1d850 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
1d860 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
1d870 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
1d880 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
1d890 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
1d8a0 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
1d8b0 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
1d8c0 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
1d8d0 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
1d8e0 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
1d8f0 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
1d900 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
1d910 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
1d920 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
1d930 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1d940 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
1d950 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
1d960 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
1d970 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
1d980 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
1d990 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
1d9a0 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75  rc = robust_ftru
1d9b0 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1d9c0 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20  (off_t)nByte);. 
1d9d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
1d9e0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1d9f0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
1da00 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1da10 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1da20 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1da30 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1da40 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
1da50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1da60 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1da70 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1da80 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1da90 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1daa0 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
1dab0 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1dac0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1dad0 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1dae0 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1daf0 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
1db00 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
1db10 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
1db20 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1db30 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
1db40 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
1db50 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1db60 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
1db70 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
1db80 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
1db90 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
1dba0 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
1dbb0 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
1dbc0 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
1dbd0 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
1dbe0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1dbf0 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
1dc00 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
1dc10 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1dc20 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
1dc30 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1dc40 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1dc50 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
1dc60 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
1dc70 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
1dc80 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
1dc90 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
1dca0 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
1dcb0 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
1dcc0 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
1dcd0 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
1dce0 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
1dcf0 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
1dd00 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
1dd10 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
1dd20 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
1dd30 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
1dd40 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
1dd50 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1dd60 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
1dd70 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
1dd80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1dd90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dda0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
1ddb0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
1ddc0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
1ddd0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
1dde0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1ddf0 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
1de00 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1de10 2a 70 53 69 7a 65 29 7b 0a 20 20 75 6e 69 78 46  *pSize){.  unixF
1de20 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1de30 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
1de40 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
1de50 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
1de60 74 28 20 69 64 20 29 3b 0a 20 20 69 66 28 20 70  t( id );.  if( p
1de70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1de80 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 46 45 52  & UNIXFILE_DEFER
1de90 52 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  RED ){.    rc = 
1dea0 6f 73 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50  osStat(pFile->zP
1deb0 61 74 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20  ath, &buf);.    
1dec0 69 66 28 20 72 63 20 26 26 20 65 72 72 6e 6f 3d  if( rc && errno=
1ded0 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
1dee0 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 62   rc = 0;.      b
1def0 75 66 2e 73 74 5f 73 69 7a 65 20 3d 20 30 3b 0a  uf.st_size = 0;.
1df00 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1df10 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28     rc = osFstat(
1df20 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b  pFile->h, &buf);
1df30 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
1df40 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
1df50 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1df60 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1df70 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
1df80 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1df90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1dfa0 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
1dfb0 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
1dfc0 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65  ;..  /* When ope
1dfd0 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65  ning a zero-size
1dfe0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
1dff0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70  indInodeInfo() p
1e000 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72  rocedure.  ** wr
1e010 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79  ites a single by
1e020 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c  te into that fil
1e030 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f  e in order to wo
1e040 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a  rk around a bug.
1e050 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58    ** in the OS-X
1e060 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
1e070 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  m.  In order to 
1e080 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77  avoid problems w
1e090 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c  ith upper.  ** l
1e0a0 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74  ayers, we need t
1e0b0 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69  o report this fi
1e0c0 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20  le size as zero 
1e0d0 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
1e0e0 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e  s.  ** really 1.
1e0f0 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e     Ticket #3260.
1e100 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69  .  */.  if( *pSi
1e110 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d  ze==1 ) *pSize =
1e120 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51   0;..  return SQ
1e130 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1e140 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1e150 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1e160 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1e170 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
1e180 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
1e190 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
1e1a0 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
1e1b0 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
1e1c0 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
1e1d0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
1e1e0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
1e1f0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1e200 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1e210 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  );.#endif../* .*
1e220 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e230 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
1e240 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46  dle the SQLITE_F
1e250 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a  CNTL_SIZE_HINT .
1e260 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ** file-control 
1e270 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61  operation.  Enla
1e280 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rge the database
1e290 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69   to nBytes in si
1e2a0 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75  ze.** (rounded u
1e2b0 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  p to the next ch
1e2c0 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74  unk-size).  If t
1e2d0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
1e2e0 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73  lready.** nBytes
1e2f0 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73   or larger, this
1e300 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1e310 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
1e320 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74  nt fcntlSizeHint
1e330 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1e340 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
1e350 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1e360 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20  nk>0 ){.    i64 
1e370 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
1e380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
1e390 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1e3a0 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
1e3b0 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  at buf;         
1e3c0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1e3d0 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75  hold return valu
1e3e0 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f  es of fstat() */
1e3f0 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46  .   .    if( osF
1e400 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
1e410 62 75 66 29 20 29 20 72 65 74 75 72 6e 20 53 51  buf) ) return SQ
1e420 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1e430 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28  ;..    nSize = (
1e440 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a  (nByte+pFile->sz
1e450 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65  Chunk-1) / pFile
1e460 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
1e470 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20  le->szChunk;.   
1e480 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29   if( nSize>(i64)
1e490 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a  buf.st_size ){..
1e4a0 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
1e4b0 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
1e4c0 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
1e4d0 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20  FALLOCATE.      
1e4e0 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f  /* The code belo
1e4f0 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68  w is handling th
1e500 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
1e510 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20  f osFallocate() 
1e520 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  .      ** correc
1e530 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  tly. posix_fallo
1e540 63 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65  cate() is define
1e550 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65  d to "returns ze
1e560 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a  ro on success, .
1e570 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65        ** or an e
1e580 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20  rror number on  
1e590 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68  failure". See th
1e5a0 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65  e manpage for de
1e5b0 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tails. */.      
1e5c0 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64  int err;.      d
1e5d0 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d  o{.        err =
1e5e0 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69   osFallocate(pFi
1e5f0 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69  le->h, buf.st_si
1e600 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74  ze, nSize-buf.st
1e610 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77  _size);.      }w
1e620 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52  hile( err==EINTR
1e630 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72   );.      if( er
1e640 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
1e650 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23  E_IOERR_WRITE;.#
1e660 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66  else.      /* If
1e670 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74   the OS does not
1e680 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c   have posix_fall
1e690 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74  ocate(), fake it
1e6a0 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20 20 20  . First use.    
1e6b0 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29    ** ftruncate()
1e6c0 20 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65   to set the file
1e6d0 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74   size, then writ
1e6e0 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  e a single byte 
1e6f0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
1e700 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63  last byte in eac
1e710 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74  h block within t
1e720 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69  he extended regi
1e730 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a  on. This.      *
1e740 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 74 65  * is the same te
1e750 63 68 6e 69 71 75 65 20 75 73 65 64 20 62 79 20  chnique used by 
1e760 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65  glibc to impleme
1e770 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  nt posix_falloca
1e780 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  te().      ** on
1e790 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f   systems that do
1e7a0 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c   not have a real
1e7b0 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73   fallocate() sys
1e7c0 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20  tem call..      
1e7d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c  */.      int nBl
1e7e0 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69  k = buf.st_blksi
1e7f0 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73  ze;  /* File-sys
1e800 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a  tem block size *
1e810 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69  /.      i64 iWri
1e820 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1e830 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73      /* Next offs
1e840 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  et to write to *
1e850 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  /..      if( rob
1e860 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1e870 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29  ile->h, nSize) )
1e880 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1e890 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1e8a0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
1e8b0 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1e8c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1e8d0 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1e8e0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1e8f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e900 20 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e   iWrite = ((buf.
1e910 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b  st_size + 2*nBlk
1e920 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b   - 1)/nBlk)*nBlk
1e930 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  -1;.      while(
1e940 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b   iWrite<nSize ){
1e950 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72  .        int nWr
1e960 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
1e970 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65  te(pFile, iWrite
1e980 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20  , "", 1);.      
1e990 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20    if( nWrite!=1 
1e9a0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1e9b0 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
1e9c0 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e       iWrite += n
1e9d0 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Blk;.      }.#en
1e9e0 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  dif.    }.  }..#
1e9f0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1ea00 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
1ea10 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1ea20 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70 46  ax>0 && nByte>pF
1ea30 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1ea40 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1ea50 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1ea60 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  unk<=0 ){.      
1ea70 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
1ea80 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e  cate(pFile->h, n
1ea90 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
1eaa0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1eab0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
1eac0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1ead0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1eae0 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1eaf0 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1eb00 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1eb10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
1eb20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
1eb30 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ile, nByte);.   
1eb40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1eb50 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1eb60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1eb70 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1eb80 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67   inititially neg
1eb90 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
1eba0 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
1ebb0 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
1ebc0 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
1ebd0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1ebe0 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
1ebf0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
1ec00 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
1ec10 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
1ec20 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
1ec30 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
1ec40 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1ec50 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1ec60 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e  d unixModeBit(un
1ec70 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
1ec80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73  nsigned char mas
1ec90 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20  k, int *pArg){. 
1eca0 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a   if( *pArg<0 ){.
1ecb0 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69      *pArg = (pFi
1ecc0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1ecd0 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  mask)!=0;.  }els
1ece0 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30  e if( (*pArg)==0
1ecf0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
1ed00 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73  trlFlags &= ~mas
1ed10 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
1ed20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1ed30 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a   |= mask;.  }.}.
1ed40 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
1ed50 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
1ed60 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
1ed70 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
1ed80 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a  char *zBuf);../*
1ed90 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** Information 
1eda0 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61  and control of a
1edb0 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  n open file hand
1edc0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1edd0 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f  t unixFileContro
1ede0 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
1edf0 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
1ee00 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46   *pArg){.  unixF
1ee10 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1ee20 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77  ixFile*)id;.  sw
1ee30 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1ee40 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1ee50 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
1ee60 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1ee70 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   = pFile->eFileL
1ee80 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ock;.      retur
1ee90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1eea0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1eeb0 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
1eec0 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1eed0 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  rg = pFile->last
1eee0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  Errno;.      ret
1eef0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ef00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1ef10 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
1ef20 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
1ef30 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
1ef40 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
1ef50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ef60 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1ef70 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1ef80 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
1ef90 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1efa0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1efb0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1efc0 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a     rc = fcntlSiz
1efd0 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69  eHint(pFile, *(i
1efe0 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  64 *)pArg);.    
1eff0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1f000 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1f010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f020 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1f030 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
1f040 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e  _WAL: {.      un
1f050 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  ixModeBit(pFile,
1f060 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
1f070 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
1f080 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1f090 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f0a0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1f0b0 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
1f0c0 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
1f0d0 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74       unixModeBit
1f0e0 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45  (pFile, UNIXFILE
1f0f0 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72  _PSOW, (int*)pAr
1f100 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1f110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f120 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1f130 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a  E_FCNTL_VFSNAME:
1f140 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a   {.      *(char*
1f150 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1f160 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70  _mprintf("%s", p
1f170 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d  File->pVfs->zNam
1f180 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1f190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f1a0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1f1b0 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
1f1c0 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68  NAME: {.      ch
1f1d0 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c  ar *zTFile = sql
1f1e0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 46 69  ite3_malloc( pFi
1f1f0 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
1f200 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66  name );.      if
1f210 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20  ( zTFile ){.    
1f220 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e      unixGetTempn
1f230 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d  ame(pFile->pVfs-
1f240 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46  >mxPathname, zTF
1f250 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28  ile);.        *(
1f260 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54  char**)pArg = zT
1f270 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  File;.      }.  
1f280 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f290 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1f2a0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f2b0 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20  L_HAS_MOVED: {. 
1f2c0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1f2d0 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28   = fileHasMoved(
1f2e0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65  pFile);.      re
1f2f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f300 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
1f310 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1f320 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f330 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
1f340 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65  : {.      i64 ne
1f350 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29  wLimit = *(i64*)
1f360 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  pArg;.      int 
1f370 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f380 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
1f390 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  it>sqlite3Global
1f3a0 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b  Config.mxMmap ){
1f3b0 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  .        newLimi
1f3c0 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  t = sqlite3Globa
1f3d0 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a  lConfig.mxMmap;.
1f3e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28        }.      *(
1f3f0 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  i64*)pArg = pFil
1f400 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  e->mmapSizeMax;.
1f410 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
1f420 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69  it>=0 && newLimi
1f430 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t!=pFile->mmapSi
1f440 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e  zeMax && pFile->
1f450 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a  nFetchOut==0 ){.
1f460 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d          pFile->m
1f470 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77  mapSizeMax = new
1f480 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69  Limit;.        i
1f490 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  f( pFile->mmapSi
1f4a0 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
1f4b0 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
1f4c0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
1f4d0 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69    rc = unixMapfi
1f4e0 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20  le(pFile, -1);. 
1f4f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f500 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1f510 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
1f520 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1f530 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  UG.    /* The pa
1f540 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d  ger calls this m
1f550 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20  ethod to signal 
1f560 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65  that it has done
1f570 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  .    ** a rollba
1f580 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
1f590 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72  database is ther
1f5a0 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20  efore unchanged 
1f5b0 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65  and.    ** it he
1f5c0 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  nce it is OK for
1f5d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f5e0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1f5f0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63  to be.    ** unc
1f600 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  hanged..    */. 
1f610 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f620 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1f630 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  D: {.      ((uni
1f640 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70  xFile*)id)->dbUp
1f650 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  date = 0;.      
1f660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f670 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
1f680 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1f690 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1f6a0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1f6b0 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51  E__).    case SQ
1f6c0 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
1f6d0 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
1f6e0 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
1f6f0 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
1f700 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46     return proxyF
1f710 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70  ileControl(id,op
1f720 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65  ,pArg);.    }.#e
1f730 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1f740 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1f750 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1f760 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d  _APPLE__) */.  }
1f770 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f780 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
1f790 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1f7a0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1f7b0 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1f7c0 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1f7d0 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1f7e0 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1f7f0 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1f800 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1f810 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1f820 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1f830 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1f840 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1f850 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1f860 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1f870 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1f880 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1f890 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1f8a0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1f8b0 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1f8c0 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1f8d0 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1f8e0 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1f8f0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1f900 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1f910 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69   for both..*/.#i
1f920 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  fndef __QNXNTO__
1f930 20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69   .static int uni
1f940 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
1f950 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
1f960 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
1f970 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
1f980 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f990 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
1f9a0 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  SIZE;.}.#endif..
1f9b0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1f9c0 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66 20 75  ing version of u
1f9d0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  nixSectorSize() 
1f9e0 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72  is optimized for
1f9f0 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   QNX..*/.#ifdef 
1fa00 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c  __QNXNTO__.#incl
1fa10 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c  ude <sys/dcmd_bl
1fa20 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  k.h>.#include <s
1fa30 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74  ys/statvfs.h>.st
1fa40 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
1fa50 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1fa60 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
1fa70 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1fa80 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1fa90 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  if( pFile->secto
1faa0 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20  rSize == 0 ){.  
1fab0 20 20 73 74 72 75 63 74 20 73 74 61 74 76 66 73    struct statvfs
1fac0 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20   fsInfo;.       
1fad0 0a 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61  .    /* Set defa
1fae0 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70  ults for non-sup
1faf0 70 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74 65  ported filesyste
1fb00 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ms */.    pFile-
1fb10 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51  >sectorSize = SQ
1fb20 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
1fb30 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46  TOR_SIZE;.    pF
1fb40 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1fb50 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
1fb60 20 20 20 20 69 66 28 20 66 73 74 61 74 76 66 73      if( fstatvfs
1fb70 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e  (pFile->h, &fsIn
1fb80 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20  fo) == -1 ) {.  
1fb90 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65      return pFile
1fba0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
1fbb0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 73 74    }..    if( !st
1fbc0 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rcmp(fsInfo.f_ba
1fbd0 73 65 74 79 70 65 2c 20 22 74 6d 70 22 29 20 29  setype, "tmp") )
1fbe0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1fbf0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
1fc00 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
1fc10 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1fc20 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1fc30 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  =.        SQLITE
1fc40 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20  _IOCAP_ATOMIC4K 
1fc50 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72  |       /* All r
1fc60 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72  am filesystem wr
1fc70 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1fc80 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1fc90 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1fca0 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
1fcb0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
1fcc0 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
1fcd0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
1fd00 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
1fd10 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1fd20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1fd30 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
1fd40 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
1fd50 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
1fd60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd80 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
1fd90 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
1fda0 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
1fdb0 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73  se if( strstr(fs
1fdc0 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
1fdd0 20 22 65 74 66 73 22 29 20 29 7b 0a 20 20 20 20   "etfs") ){.    
1fde0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1fdf0 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1fe00 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1fe10 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1fe20 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1fe30 20 20 20 2f 2a 20 65 74 66 73 20 63 6c 75 73 74     /* etfs clust
1fe40 65 72 20 73 69 7a 65 20 77 72 69 74 65 73 20 61  er size writes a
1fe50 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
1fe60 20 20 20 20 20 28 70 46 69 6c 65 2d 3e 73 65 63       (pFile->sec
1fe70 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
1fe80 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1fe90 4d 49 43 35 31 32 29 20 7c 0a 20 20 20 20 20 20  MIC512) |.      
1fea0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1feb0 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1fec0 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1fed0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1fee0 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1ff10 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1ff20 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1ff30 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1ff40 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
1ff50 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
1ff60 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
1ff70 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1ffa0 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
1ffb0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
1ffc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73      }else if( !s
1ffd0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
1ffe0 61 73 65 74 79 70 65 2c 20 22 71 6e 78 36 22 29  asetype, "qnx6")
1fff0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
20000 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
20010 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
20020 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
20030 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
20040 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   =.        SQLIT
20050 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c  E_IOCAP_ATOMIC |
20060 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
20070 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65  filesystem write
20080 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
20090 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
200a0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
200b0 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
200c0 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
200d0 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20100 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
20110 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
20120 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
20130 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
20140 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
20150 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
20160 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20190 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
201a0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
201b0 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
201c0 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
201d0 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
201e0 71 6e 78 34 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx4") ){.      
201f0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
20200 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
20210 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
20220 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
20230 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
20240 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20   /* full bitset 
20250 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20  of atomics from 
20260 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20  max sector size 
20270 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20  and smaller */. 
20280 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e         ((pFile->
20290 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32  sectorSize / 512
202a0 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   * SQLITE_IOCAP_
202b0 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29  ATOMIC512) << 1)
202c0 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53   - 2 |.        S
202d0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
202e0 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
202f0 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
20300 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
20310 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20340 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
20350 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
20360 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
20370 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
20380 65 74 79 70 65 2c 20 22 64 6f 73 22 29 20 29 7b  etype, "dos") ){
20390 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
203a0 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
203b0 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
203c0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
203d0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
203e0 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20          /* full 
203f0 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63  bitset of atomic
20400 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f  s from max secto
20410 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c  r size and small
20420 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28  er */.        ((
20430 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
20440 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
20450 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
20460 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20  ) << 1) - 2 |.  
20470 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
20480 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
20490 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
204a0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
204b0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204e0 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
204f0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
20500 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     0;.    }else{
20510 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
20520 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20530 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
20540 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
20550 43 35 31 32 20 7c 20 20 20 20 20 20 2f 2a 20 62  C512 |      /* b
20560 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d 69 63  locks are atomic
20570 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
20580 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
20590 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
205a0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
205b0 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
205c0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205e0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
205f0 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
20600 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
20610 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74   }.  }.  /* Last
20620 20 63 68 61 6e 63 65 20 76 65 72 69 66 69 63 61   chance verifica
20630 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
20640 63 74 6f 72 20 73 69 7a 65 20 69 73 6e 27 74 20  ctor size isn't 
20650 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35 31  a multiple of 51
20660 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69  2.  ** then it i
20670 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20  sn't valid.*/.  
20680 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  if( pFile->secto
20690 72 53 69 7a 65 20 25 20 35 31 32 20 21 3d 20 30  rSize % 512 != 0
206a0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   ){.    pFile->d
206b0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
206c0 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 70 46  tics = 0;.    pF
206d0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
206e0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
206f0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
20700 7d 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65  }.  return pFile
20710 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a  ->sectorSize;.}.
20720 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e  #endif /* __QNXN
20730 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TO__ */../*.** R
20740 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65  eturn the device
20750 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
20760 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a   for the file..*
20770 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69 73  *.** This VFS is
20780 20 73 65 74 20 75 70 20 74 6f 20 72 65 74 75 72   set up to retur
20790 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  n SQLITE_IOCAP_P
207a0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
207b0 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a  TE by default..*
207c0 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
207d0 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72 61  choice is contra
207e0 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74 65  versial since te
207f0 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75 6e  chnically the un
20800 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65  derlying.** file
20810 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
20820 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65 20   always provide 
20830 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77 72  powersafe overwr
20840 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65 72  ites.  (In other
20850 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65 72  .** words, after
20860 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76   a power-loss ev
20870 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74 68  ent, parts of th
20880 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 72 65  e file that were
20890 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74 65   never.** writte
208a0 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  n might end up b
208b0 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20 20  eing altered.)  
208c0 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f  However, non-PSO
208d0 57 20 62 65 68 61 76 69 6f 72 20 69 73 20 76 65  W behavior is ve
208e0 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72 65  ry,.** very rare
208f0 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e 67  .  And asserting
20900 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61   PSOW makes a la
20910 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69 6e  rge reduction in
20920 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f   the amount.** o
20930 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66  f required I/O f
20940 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73  or journaling, s
20950 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61  ince a lot of pa
20960 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61  dding is elimina
20970 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20  ted..**  Hence, 
20980 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f  while POWERSAFE_
20990 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20  OVERWRITE is on 
209a0 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72  by default, ther
209b0 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74  e is a file-cont
209c0 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  rol.** available
209d0 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20   to turn it off 
209e0 61 6e 64 20 55 52 49 20 71 75 65 72 79 20 70 61  and URI query pa
209f0 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c  rameter availabl
20a00 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66  e to turn it off
20a10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20a20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
20a30 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
20a40 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
20a50 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e  nixFile *p = (un
20a60 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
20a70 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66  t rc = 0;.#ifdef
20a80 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66   __QNXNTO__.  if
20a90 28 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d  ( p->sectorSize=
20aa0 3d 30 20 29 20 75 6e 69 78 53 65 63 74 6f 72 53  =0 ) unixSectorS
20ab0 69 7a 65 28 69 64 29 3b 0a 20 20 72 63 20 3d 20  ize(id);.  rc = 
20ac0 70 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  p->deviceCharact
20ad0 65 72 69 73 74 69 63 73 3b 0a 23 65 6e 64 69 66  eristics;.#endif
20ae0 0a 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c  .  if( p->ctrlFl
20af0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50  ags & UNIXFILE_P
20b00 53 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 7c 3d  SOW ){.    rc |=
20b10 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
20b20 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
20b30 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
20b40 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
20b50 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
20b60 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73  ./*.** Object us
20b70 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
20b80 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  an shared memory
20b90 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a   buffer.  .**.**
20ba0 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
20bb0 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
20bc0 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77 61  ence the same wa
20bd0 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68  l-index, each th
20be0 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20  read.** has its 
20bf0 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  own unixShm obje
20c00 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c  ct, but they all
20c10 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
20c20 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f  le instance.** o
20c30 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f  f this unixShmNo
20c40 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f  de object.  In o
20c50 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68  ther words, each
20c60 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70   wal-index is op
20c70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63  ened.** only onc
20c80 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a  e per process..*
20c90 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68  *.** Each unixSh
20ca0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
20cb0 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73  connected to a s
20cc0 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49  ingle unixInodeI
20cd0 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57  nfo object..** W
20ce0 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65  e could coalesce
20cf0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74   this object int
20d00 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c  o unixInodeInfo,
20d10 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20   but that would 
20d20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70  mean.** every op
20d30 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65  en file that doe
20d40 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64  s not use shared
20d50 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65   memory (in othe
20d60 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a  r words, most.**
20d70 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75   open files) wou
20d80 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72 72 79  ld have to carry
20d90 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74   around this ext
20da0 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ra information. 
20db0 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49   So.** the unixI
20dc0 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
20dd0 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
20de0 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53  er to this unixS
20df0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a  hmNode object.**
20e00 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d   and the unixShm
20e10 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63  Node object is c
20e20 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  reated only when
20e30 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75   needed..**.** u
20e40 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  nixMutexHeld() m
20e50 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
20e60 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
20e70 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
20e80 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
20e90 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
20ea0 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
20eb0 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
20ec0 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54      nRef.**.** T
20ed0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
20ee0 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
20ef0 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
20f00 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
20f10 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a  * .**      fid.*
20f20 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  *      zFilename
20f30 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e  .**.** Either un
20f40 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20  ixShmNode.mutex 
20f50 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20  must be held or 
20f60 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66  unixShmNode.nRef
20f70 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d  ==0 and.** unixM
20f80 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72  utexHeld() is tr
20f90 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ue when reading 
20fa0 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f  or writing any o
20fb0 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e  ther field.** in
20fc0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
20fd0 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53  .*/.struct unixS
20fe0 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49  hmNode {.  unixI
20ff0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
21000 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f  ;     /* unixIno
21010 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73  deInfo that owns
21020 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a   this SHM node *
21030 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
21040 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f  x *mutex;      /
21050 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73  * Mutex to acces
21060 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  s this object */
21070 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
21080 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
21090 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61   Name of the mma
210a0 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
210b0 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  nt h;           
210c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
210d0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
210e0 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  r */.  int szReg
210f0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
21100 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
21110 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
21120 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67  ns */.  u16 nReg
21130 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
21140 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
21150 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
21160 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b    u8 isReadonly;
21170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21180 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c  True if read-onl
21190 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70  y */.  char **ap
211a0 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
211b0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61    /* Array of ma
211c0 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  pped shared-memo
211d0 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
211e0 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
211f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21200 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20  mber of unixShm 
21210 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
21220 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e   to this */.  un
21230 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  ixShm *pFirst;  
21240 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
21250 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
21260 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
21270 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
21280 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63  E_DEBUG.  u8 exc
21290 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
212a0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
212b0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
212c0 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61  held */.  u8 sha
212d0 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
212e0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
212f0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
21300 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68  d */.  u8 nextSh
21310 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
21320 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
21330 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76  ble unixShm.id v
21340 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
21350 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  ;../*.** Structu
21360 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
21370 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
21380 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
21390 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
213a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
213b0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
213c0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
213d0 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
213e0 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
213f0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
21400 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
21410 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
21420 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78  r:.**.**    unix
21430 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20  Shm.pFile.**    
21440 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a  unixShm.id.**.**
21450 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64   All other field
21460 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
21470 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70  .  The unixShm.p
21480 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  File->mutex must
21490 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
214a0 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
214b0 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
214c0 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  s..*/.struct uni
214d0 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d  xShm {.  unixShm
214e0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
214f0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
21500 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64  lying unixShmNod
21510 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e  e object */.  un
21520 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  ixShm *pNext;   
21530 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
21540 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68   unixShm with th
21550 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f  e same unixShmNo
21560 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
21570 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
21580 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
21590 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68  lding the unixSh
215a0 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20  mNode mutex */. 
215b0 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
215c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
215d0 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
215e0 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20  tion within its 
215f0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
21600 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b   u16 sharedMask;
21610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21620 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
21630 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31  cks held */.  u1
21640 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  6 exclMask;     
21650 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
21660 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
21670 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a  cks held */.};..
21680 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
21690 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
216a0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  .*/.#define UNIX
216b0 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
216c0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
216d0 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a  K)*4)         /*
216e0 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
216f0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
21700 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49  _SHM_DMS    (UNI
21710 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54  X_SHM_BASE+SQLIT
21720 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a  E_SHM_NLOCK)  /*
21730 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20   deadman switch 
21740 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  */../*.** Apply 
21750 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
21760 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74  ocks for all byt
21770 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72  es from ofst thr
21780 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a  ough ofst+n-1..*
21790 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b  *.** Locks block
217a0 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20   if the mask is 
217b0 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d  exactly UNIX_SHM
217c0 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62  _C and are non-b
217d0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72  locking.** other
217e0 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
217f0 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65  int unixShmSyste
21800 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d  mLock(.  unixShm
21810 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20  Node *pShmNode, 
21820 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74  /* Apply locks t
21830 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72  o this open shar
21840 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
21850 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54  t */.  int lockT
21860 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ype,          /*
21870 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43   F_UNLCK, F_RDLC
21880 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f  K, or F_WRLCK */
21890 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
218a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
218b0 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c  st byte of the l
218c0 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a  ocking range */.
218d0 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20    int n         
218e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
218f0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
21900 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
21910 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20  ct flock f;     
21920 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61    /* The posix a
21930 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20  dvisory locking 
21940 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
21950 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21960 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63  K;   /* Result c
21970 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29  ode form fcntl()
21980 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
21990 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e   to the unixShmN
219a0 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
219b0 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
219c0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
219d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
219e0 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d  x_held(pShmNode-
219f0 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e  >mutex) || pShmN
21a00 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ode->nRef==0 );.
21a10 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63  .  /* Shared loc
21a20 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f  ks never span mo
21a30 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65  re than one byte
21a40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   */.  assert( n=
21a50 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d  =1 || lockType!=
21a60 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a  F_RDLCK );..  /*
21a70 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69   Locks are withi
21a80 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73  n range */.  ass
21a90 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53  ert( n>=1 && n<S
21aa0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
21ab0 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
21ac0 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
21ad0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
21ae0 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
21af0 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  ters */.    mems
21b00 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&f, 0, sizeof
21b10 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79  (f));.    f.l_ty
21b20 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20  pe = lockType;. 
21b30 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20     f.l_whence = 
21b40 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e  SEEK_SET;.    f.
21b50 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a  l_start = ofst;.
21b60 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b      f.l_len = n;
21b70 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  ..    rc = osFcn
21b80 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  tl(pShmNode->h, 
21b90 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20  F_SETLK, &f);.  
21ba0 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29    rc = (rc!=(-1)
21bb0 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  ) ? SQLITE_OK : 
21bc0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
21bd0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
21be0 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74  e global lock st
21bf0 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67  ate and do debug
21c00 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64   tracing */.#ifd
21c10 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
21c20 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20    { u16 mask;.  
21c30 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
21c40 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d  CK "));.  mask =
21c50 20 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66   ofst>31 ? 0xfff
21c60 66 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  f : (1<<(ofst+n)
21c70 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
21c80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21c90 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f  OK ){.    if( lo
21ca0 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
21cb0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
21cc0 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22  (("unlock %d ok"
21cd0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
21ce0 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
21cf0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
21d00 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
21d10 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
21d20 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
21d30 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43  lockType==F_RDLC
21d40 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
21d50 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25  CE(("read-lock %
21d60 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
21d70 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
21d80 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
21d90 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
21da0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
21db0 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  mask;.    }else{
21dc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
21dd0 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
21de0 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
21df0 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
21e00 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
21e10 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
21e20 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
21e30 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21e40 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
21e50 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
21e60 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  lse{.    if( loc
21e70 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
21e80 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
21e90 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ("unlock %d fail
21ea0 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
21eb0 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
21ec0 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
21ed0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21ee0 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64  read-lock failed
21ef0 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  "));.    }else{.
21f00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
21f10 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
21f20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
21f30 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
21f40 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29   failed", ofst))
21f50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
21f60 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72  TRACE((" - after
21f70 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c  wards %03x,%03x\
21f80 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
21f90 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
21fa0 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65  ask, pShmNode->e
21fb0 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23  xclMask));.  }.#
21fc0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
21fd0 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a  rc;        .}...
21fe0 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
21ff0 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20  unixShmNodeList 
22000 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
22010 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d  ies with unixShm
22020 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a  Node.nRef==0..**
22030 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
22040 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  a VFS shared-mem
22050 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69  ory method; it i
22060 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63  s a utility func
22070 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62  tion called.** b
22080 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  y VFS shared-mem
22090 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  ory methods..*/.
220a0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
220b0 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c  ShmPurge(unixFil
220c0 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53  e *pFd){.  unixS
220d0 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d  hmNode *p = pFd-
220e0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
220f0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
22100 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
22110 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52    if( p && p->nR
22120 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ef==0 ){.    int
22130 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
22140 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e  p->pInode==pFd->
22150 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71  pInode );.    sq
22160 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
22170 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
22180 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
22190 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  egion; i++){.   
221a0 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
221b0 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d  {.        osMunm
221c0 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ap(p->apRegion[i
221d0 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b  ], p->szRegion);
221e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
221f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22200 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ee(p->apRegion[i
22210 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
22220 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
22230 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b  ee(p->apRegion);
22240 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30  .    if( p->h>=0
22250 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   ){.      robust
22260 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68  _close(pFd, p->h
22270 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
22280 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20     p->h = -1;.  
22290 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64    }.    p->pInod
222a0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e->pShmNode = 0;
222b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
222c0 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
222d0 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64  ** Open a shared
222e0 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
222f0 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65  ociated with ope
22300 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
22310 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73  pDbFd.  .** This
22320 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c   particular impl
22330 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
22340 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a  mmapped files..*
22350 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73  *.** The file us
22360 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
22370 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73  shared-memory is
22380 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
22390 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65  ectory.** as the
223a0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
223b0 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20  ile and has the 
223c0 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
223d0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a   open database.*
223e0 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  * file with the 
223f0 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64  "-shm" suffix ad
22400 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ded.  For exampl
22410 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  e, if the databa
22420 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f  se file.** is "/
22430 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
22440 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66  g.db" then the f
22450 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61  ile that is crea
22460 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a  ted and mmapped.
22470 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  ** for shared me
22480 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c  mory will be cal
22490 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31  led "/home/user1
224a0 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e  /config.db-shm".
224b0 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72    .**.** Another
224c0 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20   approach to is 
224d0 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20  to use files in 
224e0 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76  /dev/shm or /dev
224f0 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f  /tmp or an.** so
22500 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d  me other tmpfs m
22510 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66  ount. But if a f
22520 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65  ile in a differe
22530 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  nt directory.** 
22540 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
22550 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20  e file is used, 
22560 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61  then differing a
22570 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
22580 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74  s.** or a chroot
22590 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74  () might cause t
225a0 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f  wo different pro
225b0 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61  cesses on the sa
225c0 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  me.** database t
225d0 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64  o end up using d
225e0 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66  ifferent files f
225f0 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
22600 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74   - .** meaning t
22610 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  hat their memory
22620 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c   would not reall
22630 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65  y be shared - re
22640 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61  sulting.** in da
22650 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
22660 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  n.  Nevertheless
22670 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c  , this tmpfs fil
22680 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62  e usage.** can b
22690 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  e enabled at com
226a0 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20  pile-time using 
226b0 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  -DSQLITE_SHM_DIR
226c0 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d  ECTORY="/dev/shm
226d0 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69  ".** or the equi
226e0 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65  valent.  The use
226f0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   of the SQLITE_S
22700 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
22710 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74  pile-time.** opt
22720 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ion results in a
22730 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62  n incompatible b
22740 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20  uild of SQLite; 
22750 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74   builds of SQLit
22760 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64  e.** that with d
22770 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f  iffering SQLITE_
22780 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65  SHM_DIRECTORY se
22790 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74  ttings attempt t
227a0 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d  o use the.** sam
227b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
227c0 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
227d0 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  , database corru
227e0 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c  ption will likel
227f0 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65  y.** result. The
22800 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
22810 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69  CTORY compile-ti
22820 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e  me option is con
22830 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75  sidered.** "unsu
22840 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79  pported" and may
22850 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75   go away in a fu
22860 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65  ture SQLite rele
22870 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ase..**.** When 
22880 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
22890 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
228a0 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
228b0 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
228c0 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
228d0 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
228e0 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
228f0 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
22900 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
22910 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
22920 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
22930 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
22940 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
22950 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72  .**.** If the or
22960 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
22970 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73 20  file (pDbFd) is 
22980 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d  using the "unix-
22990 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61  excl" VFS.** tha
229a0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20  t means that an 
229b0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
229c0 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
229d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a  tabase file and.
229e0 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ** that no other
229f0 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 61   processes are a
22a00 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ble to read or w
22a10 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
22a20 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63  e.  In.** that c
22a30 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72  ase, we do not r
22a40 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65  eally need share
22a50 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68  d memory.  No sh
22a60 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  ared memory.** f
22a70 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ile is created. 
22a80 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
22a90 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c  ry will be simul
22aa0 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20 6d  ated with heap m
22ab0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
22ac0 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61   int unixOpenSha
22ad0 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69  redMemory(unixFi
22ae0 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
22af0 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20  ruct unixShm *p 
22b00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
22b10 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
22b20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
22b30 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
22b40 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
22b50 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
22b60 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ing mmapped file
22b70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
22b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b90 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
22ba0 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  code */.  unixIn
22bb0 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
22bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22bd0 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a   inode of fd */.
22be0 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65    char *zShmFile
22bf0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
22c00 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
22c10 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53   file used for S
22c20 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d  HM */.  int nShm
22c30 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
22c40 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
22c50 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e  of the SHM filen
22c60 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
22c70 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
22c80 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
22c90 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e   unixShm object.
22ca0 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
22cb0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
22cc0 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
22cd0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
22ce0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
22cf0 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
22d00 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *p));.  assert( 
22d10 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
22d20 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
22d30 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53 68   see if a unixSh
22d40 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72  mNode object alr
22d50 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65 75  eady exists. Reu
22d60 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  se an existing. 
22d70 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65   ** one if prese
22d80 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77  nt. Create a new
22d90 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
22da0 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  y..  */.  unixEn
22db0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
22dc0 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
22dd0 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  node;.  pShmNode
22de0 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e   = pInode->pShmN
22df0 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  ode;.  if( pShmN
22e00 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ode==0 ){.    st
22e10 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f   /* fstat() info
22e40 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69   for database fi
22e50 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61  le */..    /* Ca
22e60 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69  ll fstat() to fi
22e70 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72  gure out the per
22e80 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
22e90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
22ea0 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a  f.    ** a new *
22eb0 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65  -shm file is cre
22ec0 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74  ated, an attempt
22ed0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
22ee0 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a   create it.    *
22ef0 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
22f00 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20  permissions..   
22f10 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73   */.    if( osFs
22f20 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73  tat(pDbFd->h, &s
22f30 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65 2d  Stat) && pInode-
22f40 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
22f50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
22f60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
22f70 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
22f80 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
22f90 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
22fa0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
22fb0 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
22fc0 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f  = sizeof(SQLITE_
22fd0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b  SHM_DIRECTORY) +
22fe0 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e   31;.#else.    n
22ff0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20  ShmFilename = 6 
23000 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 44  + (int)strlen(pD
23010 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e  bFd->zPath);.#en
23020 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
23030 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
23040 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  c( sizeof(*pShmN
23050 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e  ode) + nShmFilen
23060 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ame );.    if( p
23070 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
23080 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23090 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
230a0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
230b0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
230c0 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69  (pShmNode, 0, si
230d0 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b  zeof(*pShmNode)+
230e0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  nShmFilename);. 
230f0 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20     zShmFilename 
23100 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
23110 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
23120 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66  pShmNode[1];.#if
23130 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
23140 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c  IRECTORY.    sql
23150 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53  ite3_snprintf(nS
23160 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d  hmFilename, zShm
23170 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20  Filename, .     
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23190 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
231a0 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68  TORY "/sqlite-sh
231b0 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20  m-%x-%x",.      
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
231d0 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f  u32)sStat.st_ino
231e0 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f  , (u32)sStat.st_
231f0 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  dev);.#else.    
23200 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
23210 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
23220 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ShmFilename, "%s
23230 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  -shm", pDbFd->zP
23240 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
23250 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
23260 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46  Fd->zPath, zShmF
23270 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
23280 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  .    pShmNode->h
23290 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64   = -1;.    pDbFd
232a0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
232b0 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20  de = pShmNode;. 
232c0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e     pShmNode->pIn
232d0 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
232e0 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
232f0 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
23300 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
23310 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
23320 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
23330 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
23340 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
23350 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
23360 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
23370 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
23380 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
23390 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
233a0 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73     int openFlags
233b0 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
233c0 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73  EAT;.      if( s
233d0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
233e0 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  an(pDbFd->zPath,
233f0 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c   "readonly_shm",
23400 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f   0) ){.        o
23410 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
23420 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68  NLY;.        pSh
23430 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
23440 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 1;.      }. 
23450 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68       pShmNode->h
23460 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
23470 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65  ShmFilename, ope
23480 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73  nFlags, (sStat.s
23490 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20  t_mode&0777));. 
234a0 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
234b0 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20  e->h<0 ){.      
234c0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
234d0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
234e0 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
234f0 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
23500 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
23510 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
23520 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
23530 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
23540 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
23550 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
23560 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20   the SHM file.  
23570 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20      ** is owned 
23580 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65 72  by the same user
23590 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f   that owns the o
235a0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
235b0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  .  Otherwise,.  
235c0 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
235d0 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e  nal owner will n
235e0 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f  ot be able to co
235f0 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  nnect..      */.
23600 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 70        osFchown(p
23610 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61  ShmNode->h, sSta
23620 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e  t.st_uid, sStat.
23630 73 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20 20  st_gid);.  .    
23640 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
23650 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
23660 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
23670 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
23680 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  tch..      ** If
23690 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
236a0 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
236b0 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a  length. .      *
236c0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
236d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
236e0 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  ( unixShmSystemL
236f0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
23700 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  WRLCK, UNIX_SHM_
23710 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f  DMS, 1)==SQLITE_
23720 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
23730 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  ( robust_ftrunca
23740 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
23750 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
23760 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
23770 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
23780 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61  HMOPEN, "ftrunca
23790 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  te", zShmFilenam
237a0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
237b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
237c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
237d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
237e0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
237f0 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43  pShmNode, F_RDLC
23800 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
23810 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
23820 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
23830 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
23840 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
23850 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
23860 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
23870 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  f the unixShmNod
23880 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
23890 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
238a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
238b0 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
238c0 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
238d0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
238e0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
238f0 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
23900 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
23910 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
23920 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
23930 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
23940 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
23950 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
23960 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
23970 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
23980 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
23990 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
239a0 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
239b0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f  truct unixShm) o
239c0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
239d0 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
239e0 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
239f0 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
23a00 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
23a10 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
23a20 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
23a30 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
23a40 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
23a50 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
23a60 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
23a70 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
23a80 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
23a90 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
23aa0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
23ab0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
23ac0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
23ad0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
23ae0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
23af0 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
23b00 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
23b10 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
23b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23b30 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
23b40 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
23b50 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
23b60 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
23b70 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a  pDbFd);       /*
23b80 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
23b90 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
23ba0 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
23bb0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e  e3_free(p);.  un
23bc0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
23bd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23be0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
23bf0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
23c00 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
23c10 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
23c20 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
23c30 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
23c40 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
23c50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
23c60 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
23c70 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
23c80 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
23c90 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
23ca0 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
23cb0 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
23cc0 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
23cd0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
23ce0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
23cf0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
23d00 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
23d10 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
23d20 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
23d30 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65  se, if the bExte
23d40 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
23d50 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
23d60 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
23d70 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
23d80 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
23d90 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
23da0 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
23db0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
23dc0 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
23dd0 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
23de0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
23df0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
23e00 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65  ed. If .** bExte
23e10 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  nd is non-zero a
23e20 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
23e30 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
23e40 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
23e50 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
23e60 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
23e70 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
23e80 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
23e90 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
23ea0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
23eb0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
23ec0 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
23ed0 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
23ee0 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
23ef0 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
23f00 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
23f10 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
23f20 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
23f30 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
23f40 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
23f50 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
23f60 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
23f70 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
23f80 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
23f90 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
23fa0 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
23fb0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
23fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
23fd0 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
23fe0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
23ff0 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24010 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
24020 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
24030 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
24040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
24050 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
24060 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20    int bExtend,  
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24080 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
24090 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
240a0 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
240b0 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
240c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
240d0 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
240e0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
240f0 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
24100 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
24110 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68  Shm *p;.  unixSh
24120 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
24130 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24140 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
24150 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
24160 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  y file has not y
24170 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
24180 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
24190 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68    if( pDbFd->pSh
241a0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  m==0 ){.    rc =
241b0 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
241c0 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
241d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
241e0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
241f0 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46  .  }..  p = pDbF
24200 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
24210 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
24220 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
24230 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
24240 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
24250 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
24260 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
24270 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
24280 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61  Region==0 );.  a
24290 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
242a0 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
242b0 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  pInode );.  asse
242c0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
242d0 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
242e0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
242f0 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
24300 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
24310 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
24320 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
24330 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
24340 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
24350 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68  Region ){.    ch
24360 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20  ar **apNew;     
24370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24380 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e   /* New apRegion
24390 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
243a0 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
243b0 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
243c0 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
243d0 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
243e0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
243f0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
24400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
24410 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f  ed by fstat() */
24420 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
24430 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
24440 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  ion;..    if( pS
24450 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
24460 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
24470 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73  uested region is
24480 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   not mapped into
24490 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
244a0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20  address space.. 
244b0 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f       ** Check to
244c0 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
244d0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
244e0 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
244f0 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
24500 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
24510 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
24520 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
24530 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  on)..      */.  
24540 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
24550 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53  pShmNode->h, &sS
24560 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tat) ){.        
24570 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
24580 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20  R_SHMSIZE;.     
24590 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
245a0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  out;.      }.  .
245b0 20 20 20 20 20 20 69 66 28 20 73 53 74 61 74 2e        if( sStat.
245c0 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b  st_size<nByte ){
245d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
245e0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
245f0 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74   region does not
24600 20 65 78 69 73 74 2e 20 49 66 20 62 45 78 74 65   exist. If bExte
24610 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20  nd is set to.   
24620 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65       ** false, e
24630 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
24640 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
24650 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
24660 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
24670 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
24680 28 20 21 62 45 78 74 65 6e 64 20 29 7b 0a 20 20  ( !bExtend ){.  
24690 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
246a0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
246b0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
246c0 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
246d0 66 20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75  f bExtend is tru
246e0 65 2c 20 65 78 74 65 6e 64 20 74 68 65 20 66 69  e, extend the fi
246f0 6c 65 2e 20 44 6f 20 74 68 69 73 20 62 79 0a 20  le. Do this by. 
24700 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e         ** writin
24710 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  g a single byte 
24720 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  to the end of ea
24730 63 68 20 28 4f 53 29 20 70 61 67 65 20 62 65 69  ch (OS) page bei
24740 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  ng.        ** al
24750 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e  located or exten
24760 64 65 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79  ded. Technically
24770 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77  , we need only w
24780 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20 20 20  rite to the.    
24790 20 20 20 20 2a 2a 20 6c 61 73 74 20 70 61 67 65      ** last page
247a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74   in order to ext
247b0 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 42 75  end the file. Bu
247c0 74 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c  t writing to all
247d0 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   new.        ** 
247e0 70 61 67 65 73 20 66 6f 72 63 65 73 20 74 68 65  pages forces the
247f0 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20   OS to allocate 
24800 74 68 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79  them immediately
24810 2c 20 77 68 69 63 68 20 72 65 64 75 63 65 73 0a  , which reduces.
24820 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63          ** the c
24830 68 61 6e 63 65 73 20 6f 66 20 53 49 47 42 55 53  hances of SIGBUS
24840 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
24850 20 74 68 65 20 6d 61 70 70 65 64 20 72 65 67 69   the mapped regi
24860 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20  on later on..   
24870 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24880 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
24890 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
248a0 20 70 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20   pgsz = 4096;.  
248b0 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b          int iPg;
248c0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ..          /* W
248d0 72 69 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74  rite to the last
248e0 20 62 79 74 65 20 6f 66 20 65 61 63 68 20 6e 65   byte of each ne
248f0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  wly allocated or
24900 20 65 78 74 65 6e 64 65 64 20 70 61 67 65 20 2a   extended page *
24910 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
24920 72 74 28 20 28 6e 42 79 74 65 20 25 20 70 67 73  rt( (nByte % pgs
24930 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  z)==0 );.       
24940 20 20 20 66 6f 72 28 69 50 67 3d 28 73 53 74 61     for(iPg=(sSta
24950 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b  t.st_size/pgsz);
24960 20 69 50 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a   iPg<(nByte/pgsz
24970 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20  ); iPg++){.     
24980 20 20 20 20 20 20 20 69 66 28 20 73 65 65 6b 41         if( seekA
24990 6e 64 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f  ndWriteFd(pShmNo
249a0 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20  de->h, iPg*pgsz 
249b0 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c  + pgsz-1, "", 1,
249c0 20 30 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20   0)!=1 ){.      
249d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
249e0 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d  ar *zFile = pShm
249f0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  Node->zFilename;
24a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
24a10 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
24a20 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
24a30 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20  MSIZE, "write", 
24a40 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
24a50 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
24a60 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
24a70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24a80 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
24a90 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
24aa0 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
24ab0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
24ac0 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
24ad0 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
24ae0 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
24af0 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c  w = (char **)sql
24b00 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
24b10 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
24b20 61 70 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69  apRegion, (iRegi
24b30 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61  on+1)*sizeof(cha
24b40 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  r *).    );.    
24b50 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20  if( !apNew ){.  
24b60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24b70 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
24b80 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
24b90 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
24ba0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
24bb0 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77  n = apNew;.    w
24bc0 68 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e  hile(pShmNode->n
24bd0 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29  Region<=iRegion)
24be0 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  {.      void *pM
24bf0 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  em;.      if( pS
24c00 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
24c10 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f          pMem = o
24c20 73 4d 6d 61 70 28 30 2c 20 73 7a 52 65 67 69 6f  sMmap(0, szRegio
24c30 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  n,.            p
24c40 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
24c50 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20  nly ? PROT_READ 
24c60 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54  : PROT_READ|PROT
24c70 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20  _WRITE, .       
24c80 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c       MAP_SHARED,
24c90 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a   pShmNode->h, sz
24ca0 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d  Region*(i64)pShm
24cb0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20  Node->nRegion.  
24cc0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
24cd0 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46   if( pMem==MAP_F
24ce0 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
24cf0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
24d00 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
24d10 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22  R_SHMMAP, "mmap"
24d20 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  , pShmNode->zFil
24d30 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
24d40 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
24d50 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
24d60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24d70 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65     pMem = sqlite
24d80 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f  3_malloc(szRegio
24d90 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
24da0 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pMem==0 ){.     
24db0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24dc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
24dd0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
24de0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
24df0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65        memset(pMe
24e00 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b  m, 0, szRegion);
24e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
24e20 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
24e30 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
24e40 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20  ion] = pMem;.   
24e50 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
24e60 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
24e70 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
24e80 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
24e90 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
24ea0 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68  ){.    *pp = pSh
24eb0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
24ec0 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73  iRegion];.  }els
24ed0 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
24ee0 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f    }.  if( pShmNo
24ef0 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26  de->isReadonly &
24f00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
24f10 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45  ) rc = SQLITE_RE
24f20 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65  ADONLY;.  sqlite
24f30 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
24f40 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
24f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24f60 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
24f70 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
24f80 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
24f90 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  segment..**.** N
24fa0 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c  ote that the rel
24fb0 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
24fc0 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43  n SHAREd and EXC
24fd0 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20  LUSIVE locks is 
24fe0 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66  a little.** diff
24ff0 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20  erent here than 
25000 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53  in posix.  In xS
25010 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61  hmLock(), one ca
25020 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  n go from unlock
25030 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20  ed.** to shared 
25040 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d  and back or from
25050 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63   unlocked to exc
25060 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e  lusive and back.
25070 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a    But one may.**
25080 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61   not go from sha
25090 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  red to exclusive
250a0 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69   or from exclusi
250b0 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f  ve to shared..*/
250c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
250d0 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74  ShmLock(.  sqlit
250e0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
250f0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
25100 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
25110 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
25120 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25140 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74   /* First lock t
25150 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
25160 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c  ease */.  int n,
25170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25180 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25190 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69  f locks to acqui
251a0 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
251b0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
251d0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
251e0 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a   the lock */.){.
251f0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
25200 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
25210 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  d;      /* Conne
25220 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68  ction holding sh
25230 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
25240 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44   unixShm *p = pD
25250 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
25260 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
25270 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e  ared memory bein
25280 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  g locked */.  un
25290 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  ixShm *pX;      
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
252c0 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c  ng over all sibl
252d0 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ings */.  unixSh
252e0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
252f0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20  = p->pShmNode;  
25300 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
25310 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a  g file iNode */.
25320 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25330 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
25340 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
25350 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  t code */.  u16 
25360 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25380 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
25390 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65  ks to take or re
253a0 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  lease */..  asse
253b0 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
253c0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
253d0 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
253e0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
253f0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
25400 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
25410 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
25420 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
25430 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
25440 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
25450 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
25460 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
25470 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
25480 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
25490 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
254a0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
254b0 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
254c0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
254d0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
254e0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
254f0 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
25500 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
25510 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
25520 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
25530 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
25540 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
25550 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
25560 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  E)!=0 );.  asser
25570 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  t( pShmNode->h>=
25580 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
25590 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
255a0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
255b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c   pShmNode->h<0 |
255c0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
255d0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
255e0 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31   );..  mask = (1
255f0 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
25600 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72  <<ofst);.  asser
25610 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d  t( n>1 || mask==
25620 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73  (1<<ofst) );.  s
25630 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
25640 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
25650 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ex);.  if( flags
25660 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e   & SQLITE_SHM_UN
25670 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20  LOCK ){.    u16 
25680 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20  allMask = 0; /* 
25690 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65  Mask of locks he
256a0 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a  ld by siblings *
256b0 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66  /..    /* See if
256c0 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f   any siblings ho
256d0 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63  ld this same loc
256e0 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d  k */.    for(pX=
256f0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
25700 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
25710 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
25720 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==p ) continue;
25730 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
25740 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28  pX->exclMask & (
25750 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73  p->exclMask|p->s
25760 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29  haredMask))==0 )
25770 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20  ;.      allMask 
25780 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
25790 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
257a0 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74   Unlock the syst
257b0 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a  em-level locks *
257c0 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20  /.    if( (mask 
257d0 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b  & allMask)==0 ){
257e0 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
257f0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
25800 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c  hmNode, F_UNLCK,
25810 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
25820 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  ASE, n);.    }el
25830 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
25840 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
25850 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65  .    /* Undo the
25860 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a   local locks */.
25870 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
25890 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
258a0 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  ask;.      p->sh
258b0 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
258c0 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73  k;.    } .  }els
258d0 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
258e0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20  LITE_SHM_SHARED 
258f0 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68  ){.    u16 allSh
25900 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e  ared = 0;  /* Un
25910 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ion of locks hel
25920 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
25930 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20   other than "p" 
25940 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  */..    /* Find 
25950 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64  out which shared
25960 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61   locks are alrea
25970 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  dy held by sibli
25980 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  ng connections..
25990 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69      ** If any si
259a0 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f  bling already ho
259b0 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  lds an exclusive
259c0 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20   lock, go ahead 
259d0 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a  and return.    *
259e0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  * SQLITE_BUSY.. 
259f0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
25a00 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
25a10 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
25a20 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
25a30 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
25a40 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
25a50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25a60 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
25a70 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25a80 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20     allShared |= 
25a90 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
25aa0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
25ab0 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  t shared locks a
25ac0 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
25ad0 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  el, if necessary
25ae0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25b00 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65     if( (allShare
25b10 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  d & mask)==0 ){.
25b20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
25b30 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
25b40 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b  ShmNode, F_RDLCK
25b50 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
25b60 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
25b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
25b80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25b90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
25ba0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63    /* Get the loc
25bb0 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  al shared locks 
25bc0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
25bd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25be0 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
25bf0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  |= mask;.    }. 
25c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
25c10 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c  ake sure no sibl
25c20 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
25c30 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20  hold locks that 
25c40 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a  will block this.
25c50 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66      ** lock.  If
25c60 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20   any do, return 
25c70 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68  SQLITE_BUSY righ
25c80 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20  t away..    */. 
25c90 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
25ca0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
25cb0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
25cc0 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
25cd0 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
25ce0 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64  0 || (pX->shared
25cf0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
25d00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
25d10 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
25d20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25d30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
25d40 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
25d50 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
25d60 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
25d70 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
25d80 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  sful.    ** also
25d90 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20   mark the local 
25da0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65  connection as be
25db0 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20  ing locked..    
25dc0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
25dd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25de0 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
25df0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
25e00 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  e, F_WRLCK, ofst
25e10 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
25e20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
25e30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25e40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
25e50 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  p->sharedMask & 
25e60 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  mask)==0 );.    
25e70 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
25e80 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
25e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
25ea0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
25eb0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
25ec0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
25ed0 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64  HM-LOCK shmid-%d
25ee0 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33  , pid-%d got %03
25ef0 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20  x,%03x\n",.     
25f00 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74        p->id, get
25f10 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64  pid(), p->shared
25f20 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73  Mask, p->exclMas
25f30 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  k));.  return rc
25f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
25f50 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61  ment a memory ba
25f60 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20  rrier or memory 
25f70 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20  fence on shared 
25f80 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20  memory.  .**.** 
25f90 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74  All loads and st
25fa0 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72  ores begun befor
25fb0 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75  e the barrier mu
25fc0 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f  st complete befo
25fd0 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f  re.** any load o
25fe0 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66  r store begun af
25ff0 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e  ter the barrier.
26000 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26010 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a  unixShmBarrier(.
26020 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
26030 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  fd              
26040 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
26050 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
26060 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
26070 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
26080 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69  METER(fd);.  uni
26090 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
260a0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
260b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
260c0 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
260d0 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
260e0 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
260f0 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72  erlying .** stor
26100 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
26110 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  g is true..**.**
26120 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
26130 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  shared memory as
26140 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
26150 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65  e connection the
26160 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
26170 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  e is a harmless 
26180 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
26190 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61   int unixShmUnma
261a0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
261b0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
261c0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
261d0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
261e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  file */.  int de
261f0 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
26200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
26210 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ete shared-memor
26220 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  y if true */.){.
26230 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20    unixShm *p;   
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26250 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
26260 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  ion to be closed
26270 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
26280 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
26290 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
262a0 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
262b0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
262c0 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20  unixShm **pp;   
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
262f0 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  ver sibling conn
26300 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69  ections */.  uni
26310 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20  xFile *pDbFd;   
26320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26330 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
26340 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
26350 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78  .  pDbFd = (unix
26360 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
26370 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
26380 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
26390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
263a0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
263b0 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Node;..  assert(
263c0 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
263d0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
263e0 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
263f0 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
26400 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
26410 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  );..  /* Remove 
26420 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
26430 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
26440 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
26450 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
26460 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
26470 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
26480 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
26490 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
264a0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
264b0 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
264c0 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
264d0 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
264e0 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
264f0 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
26500 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
26510 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
26520 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
26530 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
26540 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
26550 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
26560 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
26570 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
26580 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
26590 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
265a0 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
265b0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
265c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
265d0 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
265e0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
265f0 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  --;.  if( pShmNo
26600 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
26610 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
26620 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  g && pShmNode->h
26630 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b 28 70  >=0 ) osUnlink(p
26640 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
26650 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d  me);.    unixShm
26660 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20  Purge(pDbFd);.  
26670 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
26680 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
26690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
266a0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e  else.# define un
266b0 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23  ixShmMap     0.#
266c0 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c   define unixShmL
266d0 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ock    0.# defin
266e0 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  e unixShmBarrier
266f0 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
26700 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e  ShmUnmap   0.#en
26710 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
26720 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
26730 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  /..#if SQLITE_MA
26740 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
26750 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 63 75 72  .** If it is cur
26760 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61  rently memory ma
26770 70 70 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65  pped, unmap file
26780 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pFd..*/.static 
26790 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69  void unixUnmapfi
267a0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
267b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  ){.  assert( pFd
267c0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
267d0 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61  ;.  if( pFd->pMa
267e0 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f  pRegion ){.    o
267f0 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61  sMunmap(pFd->pMa
26800 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d  pRegion, pFd->mm
26810 61 70 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20  apSizeActual);. 
26820 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69     pFd->pMapRegi
26830 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d  on = 0;.    pFd-
26840 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20  >mmapSize = 0;. 
26850 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
26860 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  Actual = 0;.  }.
26870 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
26880 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20  the system page 
26890 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
268a0 69 6e 74 20 75 6e 69 78 47 65 74 50 61 67 65 73  int unixGetPages
268b0 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 48  ize(void){.#if H
268c0 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 72 65 74  AVE_MREMAP.  ret
268d0 75 72 6e 20 35 31 32 3b 0a 23 65 6c 69 66 20 64  urn 512;.#elif d
268e0 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52  efined(_BSD_SOUR
268f0 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74  CE).  return get
26900 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73  pagesize();.#els
26910 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  e.  return (int)
26920 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45  sysconf(_SC_PAGE
26930 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  SIZE);.#endif.}.
26940 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
26950 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f  o set the size o
26960 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  f the memory map
26970 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20  ping maintained 
26980 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63  by file .** desc
26990 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e  riptor pFd to nN
269a0 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78  ew bytes. Any ex
269b0 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
269c0 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a  s discarded..**.
269d0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
269e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
269f0 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sets the followi
26a00 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a  ng variables:.**
26a10 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
26a20 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a  le.pMapRegion.**
26a30 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
26a40 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20  mmapSize.**     
26a50 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
26a60 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20  izeActual.**.** 
26a70 49 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  If unsuccessful,
26a80 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
26a90 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20  e is logged via 
26aa0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e  sqlite3_log() an
26ab0 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76  d.** the three v
26ac0 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61  ariables above a
26ad0 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68  re zeroed. In th
26ae0 69 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73  is case SQLite s
26af0 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75  hould.** continu
26b00 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
26b10 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
26b20 68 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78  he xRead() and x
26b30 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f  Write().** metho
26b40 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
26b50 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65  id unixRemapfile
26b60 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
26b70 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
26b80 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
26b90 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  riptor object */
26ba0 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20  .  i64 nNew     
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bc0 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d     /* Required m
26bd0 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29  apping size */.)
26be0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
26bf0 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20  zErr = "mmap";. 
26c00 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b   int h = pFd->h;
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
26c30 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
26c40 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38   db file */.  u8
26c50 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29   *pOrig = (u8 *)
26c60 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b  pFd->pMapRegion;
26c70 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
26c80 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61   current file ma
26c90 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e  pping */.  i64 n
26ca0 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  Orig = pFd->mmap
26cb0 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20  SizeActual;     
26cc0 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67  /* Size of pOrig
26cd0 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73   region in bytes
26ce0 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d   */.  u8 *pNew =
26cf0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
26d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
26d10 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61  cation of new ma
26d20 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66  pping */.  int f
26d30 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44  lags = PROT_READ
26d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26d50 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
26d60 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20   to mmap() */.. 
26d70 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
26d80 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
26d90 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64  assert( nNew>pFd
26da0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
26db0 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46  assert( nNew<=pF
26dc0 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
26dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
26de0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
26df0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
26e00 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  ual>=pFd->mmapSi
26e10 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
26e20 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b  MAP_FAILED!=0 );
26e30 0a 0a 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74  ..  if( (pFd->ct
26e40 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
26e50 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20  LE_RDONLY)==0 ) 
26e60 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52  flags |= PROT_WR
26e70 49 54 45 3b 0a 0a 20 20 69 66 28 20 70 4f 72 69  ITE;..  if( pOri
26e80 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  g ){.    const i
26e90 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20 75  nt szSyspage = u
26ea0 6e 69 78 47 65 74 50 61 67 65 73 69 7a 65 28 29  nixGetPagesize()
26eb0 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65  ;.    i64 nReuse
26ec0 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a   = (pFd->mmapSiz
26ed0 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d  e & ~(szSyspage-
26ee0 31 29 29 3b 0a 20 20 20 20 75 38 20 2a 70 52 65  1));.    u8 *pRe
26ef0 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73  q = &pOrig[nReus
26f00 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61  e];..    /* Unma
26f10 70 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74  p any pages of t
26f20 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
26f30 69 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20  ing that cannot 
26f40 62 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20  be reused. */.  
26f50 20 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f    if( nReuse!=nO
26f60 72 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d  rig ){.      osM
26f70 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69  unmap(pReq, nOri
26f80 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d  g-nReuse);.    }
26f90 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41  ..#if HAVE_MREMA
26fa0 50 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  P.    pNew = osM
26fb0 72 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65  remap(pOrig, nRe
26fc0 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41  use, nNew, MREMA
26fd0 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20  P_MAYMOVE);.    
26fe0 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b  zErr = "mremap";
26ff0 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20  .#else.    pNew 
27000 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e  = osMmap(pReq, n
27010 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67  New-nReuse, flag
27020 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68  s, MAP_SHARED, h
27030 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69  , nReuse);.    i
27040 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49  f( pNew!=MAP_FAI
27050 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28  LED ){.      if(
27060 20 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20   pNew!=pReq ){. 
27070 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28         osMunmap(
27080 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65  pNew, nNew - nRe
27090 75 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  use);.        pN
270a0 65 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  ew = 0;.      }e
270b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
270c0 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20  w = pOrig;.     
270d0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
270e0 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65  .    /* The atte
270f0 6d 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68  mpt to extend th
27100 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
27110 6e 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20  ng failed. Free 
27120 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
27130 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  New==MAP_FAILED 
27140 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  || pNew==0 ){.  
27150 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72      osMunmap(pOr
27160 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20  ig, nReuse);.   
27170 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
27180 70 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55  pNew is still NU
27190 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74  LL, try to creat
271a0 65 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65  e an entirely ne
271b0 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20  w mapping. */.  
271c0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
271d0 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70     pNew = osMmap
271e0 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c  (0, nNew, flags,
271f0 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20   MAP_SHARED, h, 
27200 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  0);.  }..  if( p
27210 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  New==MAP_FAILED 
27220 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  ){.    pNew = 0;
27230 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20  .    nNew = 0;. 
27240 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28     unixLogError(
27250 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c  SQLITE_OK, zErr,
27260 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20   pFd->zPath);.. 
27270 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61     /* If the mma
27280 70 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64  p() above failed
27290 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c  , assume that al
272a0 6c 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61  l subsequent mma
272b0 70 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a  p() calls.    **
272c0 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66   will probably f
272d0 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61  ail too. Fall ba
272e0 63 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61  ck to using xRea
272f0 64 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73 69  d/xWrite exclusi
27300 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74  vely.    ** in t
27310 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
27320 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d    pFd->mmapSizeM
27330 61 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46  ax = 0;.  }.  pF
27340 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
27350 28 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20  (void *)pNew;.  
27360 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  pFd->mmapSize = 
27370 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
27380 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f  ual = nNew;.}../
27390 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20  *.** Memory map 
273a0 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c  or remap the fil
273b0 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65  e opened by file
273c0 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20  -descriptor pFd 
273d0 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  (if the file.** 
273e0 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65  is already mappe
273f0 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  d, the existing 
27400 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61  mapping is repla
27410 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e  ced by the new).
27420 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72   Or, if .** ther
27430 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
27440 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74   a mapping for t
27450 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  his file, and th
27460 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a  ere are still .*
27470 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46  * outstanding xF
27480 65 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65  etch() reference
27490 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75  s to it, this fu
274a0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
274b0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  p..**.** If para
274c0 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e  meter nByte is n
274d0 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65  on-negative, the
274e0 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75  n it is the requ
274f0 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a  ested size of .*
27500 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f  * the mapping to
27510 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69   create. Otherwi
27520 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20  se, if nByte is 
27530 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
27540 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71  then the .** req
27550 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74  uested size is t
27560 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
27570 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65  ile on disk. The
27580 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
27590 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d  the.** created m
275a0 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72  apping is either
275b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
275c0 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65  ize or the value
275d0 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20   configured .** 
275e0 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e  using SQLITE_FCN
275f0 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77  TL_MMAP_LIMIT, w
27600 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c  hichever is smal
27610 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ler..**.** SQLIT
27620 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
27630 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
27640 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65  urs (even if the
27650 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a   mapping is not.
27660 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20  ** recreated as 
27670 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73  a result of outs
27680 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
27690 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  es) or an SQLite
276a0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f   error.** code o
276b0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
276c0 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66  tic int unixMapf
276d0 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
276e0 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
276f0 20 69 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74   i64 nMap = nByt
27700 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
27710 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20  assert( nMap>=0 
27720 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  || pFd->nFetchOu
27730 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t==0 );.  if( pF
27740 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29  d->nFetchOut>0 )
27750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27760 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30  K;..  if( nMap<0
27770 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
27780 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
27790 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76        /* Low-lev
277a0 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  el file informat
277b0 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ion */.    rc = 
277c0 6f 73 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20  osFstat(pFd->h, 
277d0 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69  &statbuf);.    i
277e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
277f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27800 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
27810 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  TAT;.    }.    n
27820 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74  Map = statbuf.st
27830 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  _size;.  }.  if(
27840 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53   nMap>pFd->mmapS
27850 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d  izeMax ){.    nM
27860 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ap = pFd->mmapSi
27870 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 69 66  zeMax;.  }..  if
27880 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61  ( nMap!=pFd->mma
27890 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
278a0 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20 20   nMap>0 ){.     
278b0 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70   unixRemapfile(p
278c0 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20 7d  Fd, nMap);.    }
278d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 69 78  else{.      unix
278e0 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
278f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
27900 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27910 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
27920 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
27930 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  0 */../*.** If p
27940 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20  ossible, return 
27950 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d  a pointer to a m
27960 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66  apping of file f
27970 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66  d starting at of
27980 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68  fset.** iOff. Th
27990 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62  e mapping must b
279a0 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c  e valid for at l
279b0 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e  east nAmt bytes.
279c0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61  .**.** If such a
279d0 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20   pointer can be 
279e0 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20  obtained, store 
279f0 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65  it in *pp and re
27a00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
27a10 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61  ** Or, if one ca
27a20 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f  nnot but no erro
27a30 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70  r occurs, set *p
27a40 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  p to 0 and retur
27a50 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
27a60 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  Finally, if an e
27a70 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
27a80 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
27a90 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
27aa0 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  e final.** value
27ab0 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66   of *pp is undef
27ac0 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
27ad0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  e..**.** If this
27ae0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72   function does r
27af0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c  eturn a pointer,
27b00 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   the caller must
27b10 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20   eventually .** 
27b20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  release the refe
27b30 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67  rence by calling
27b40 20 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a   unixUnfetch()..
27b50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
27b60 69 78 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f  ixFetch(sqlite3_
27b70 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
27b80 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f  ff, int nAmt, vo
27b90 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51  id **pp){.#if SQ
27ba0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
27bb0 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20  ZE>0.  unixFile 
27bc0 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  *pFd = (unixFile
27bd0 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20   *)fd;   /* The 
27be0 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
27bf0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64  ase file */.#end
27c00 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23  if.  *pp = 0;..#
27c10 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
27c20 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
27c30 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
27c40 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  >0 ){.    if( pF
27c50 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
27c60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
27c70 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
27c80 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69  Fd, -1);.      i
27c90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27ca0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27cb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d    }.    if( pFd-
27cc0 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66  >mmapSize >= iOf
27cd0 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20  f+nAmt ){.      
27ce0 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46  *pp = &((u8 *)pF
27cf0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
27d00 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d  Off];.      pFd-
27d10 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20  >nFetchOut++;.  
27d20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
27d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27d40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
27d50 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
27d60 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
27d70 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27d80 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a  n releases a .**
27d90 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69   reference obtai
27da0 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
27db0 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65  r call to unixFe
27dc0 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e  tch(). The secon
27dd0 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61  d.** argument pa
27de0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
27df0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68  ction must be th
27e00 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f  e same as the co
27e10 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61  rresponding.** a
27e20 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73  rgument that was
27e30 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75   passed to the u
27e40 6e 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63  nixFetch() invoc
27e50 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72  ation. .**.** Or
27e60 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61  , if the third a
27e70 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c  rgument is NULL,
27e80 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
27e90 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
27ea0 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72  led .** to infor
27eb0 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  m the VFS layer 
27ec0 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20  that, according 
27ed0 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78  to POSIX, any ex
27ee0 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a  isting mapping .
27ef0 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e  ** may now be in
27f00 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
27f10 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f   be unmapped..*/
27f20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27f30 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f  Unfetch(sqlite3_
27f40 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
27f50 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69  ff, void *p){.#i
27f60 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
27f70 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46  P_SIZE>0.  unixF
27f80 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
27f90 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20  File *)fd;   /* 
27fa0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
27fb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
27fc0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
27fd0 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20  ER(iOff);..  /* 
27fe0 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74  If p==0 (unmap t
27ff0 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20  he entire file) 
28000 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
28010 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  be no outstandin
28020 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72  g .  ** xFetch r
28030 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69  eferences. Or, i
28040 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20  f p!=0 (meaning 
28050 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20  it is an xFetch 
28060 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a  reference),.  **
28070 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
28080 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
28090 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a   outstanding.  *
280a0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d  /.  assert( (p==
280b0 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68  0)==(pFd->nFetch
280c0 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Out==0) );..  /*
280d0 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73   If p!=0, it mus
280e0 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66  t match the iOff
280f0 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73   value. */.  ass
28100 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d  ert( p==0 || p==
28110 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
28120 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29  pRegion)[iOff] )
28130 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
28140 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
28150 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
28160 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
28170 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  Fd);.  }..  asse
28180 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
28190 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20  ut>=0 );.#else. 
281a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
281b0 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(fd);.  UNUSED_
281c0 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
281d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
281e0 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20  (iOff);.#endif. 
281f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28200 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
28210 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
28220 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
28230 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
28240 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
28250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
28260 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
28270 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
28280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28290 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
282a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
282b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
282c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
282d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
282e0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
282f0 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
28300 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
28310 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f  ns of sqlite3_io
28320 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
28330 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65   that.** impleme
28340 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20  nt various file 
28350 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
28360 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e  es.  It also con
28370 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
28380 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22  s.** of "finder"
28390 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66   functions.  A f
283a0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
283b0 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65  s used to locate
283c0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
283d0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  .** sqlite3_io_m
283e0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f  ethods object fo
283f0 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  r a particular d
28400 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
28410 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66  he pAppData.** f
28420 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
28430 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65  te3_vfs VFS obje
28440 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  cts are initiali
28450 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65  zed to be pointe
28460 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72  rs to.** the cor
28470 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63  rect finder-func
28480 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46  tion for that VF
28490 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69  S..**.** Most fi
284a0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72  nder functions r
284b0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
284c0 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
284d0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
284e0 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e   object.  The on
284f0 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  ly interesting f
28500 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
28510 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  s autolockIoFind
28520 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f  er, which.** loo
28530 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
28540 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72  stem type and tr
28550 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65  ies to guess the
28560 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   best locking.**
28570 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74   strategy from t
28580 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66  hat..**.** For f
28590 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c  inder-funtion F,
285a0 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
285b0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
285c0 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
285d0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
285e0 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
285f0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
28600 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
28610 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
28620 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22  n named just "F"
28630 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ..**.**.** A poi
28640 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f  nter to the F po
28650 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73  inter is used as
28660 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61   the pAppData va
28670 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f  lue for VFS.** o
28680 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65  bjects.  We have
28690 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74   to do this inst
286a0 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70  ead of letting p
286b0 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a  AppData point.**
286c0 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65   directly at the
286d0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
286e0 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73   since C90 rules
286f0 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a   prevent a void*
28700 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74  .** from be cast
28710 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e   into a function
28720 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a   pointer..**.**.
28730 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
28740 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67   of this macro g
28750 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a  enerates two obj
28760 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ects:.**.**   * 
28770 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69   A constant sqli
28780 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
28790 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f  bject call METHO
287a0 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69  D that has locki
287b0 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f  ng.**      metho
287c0 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  ds CLOSE, LOCK, 
287d0 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43  UNLOCK, CKRESLOC
287e0 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  K..**.**   *  An
287f0 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64   I/O method find
28800 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
28810 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72  ed FINDER that r
28820 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
28830 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
28840 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e  METHOD object in
28850 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75   the previous bu
28860 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  llet..*/.#define
28870 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45   IOMETHODS(FINDE
28880 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49  R, METHOD, VERSI
28890 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  ON, CLOSE, LOCK,
288a0 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29   UNLOCK, CKLOCK)
288b0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
288c0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
288d0 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d  methods METHOD =
288e0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28900 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f       \.   VERSIO
28910 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
28920 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
28930 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28950 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20      \.   CLOSE, 
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
28980 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289a0 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64     \.   unixRead
289b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
289c0 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
289d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289f0 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65    \.   unixWrite
28a00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28a10 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20     /* xWrite */ 
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a40 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61   \.   unixTrunca
28a50 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
28a60 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
28a70 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a90 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20  \.   unixSync,  
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20   /* xSync */    
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28ae0 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  .   unixFileSize
28af0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28b00 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28b30 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20     LOCK,        
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28b50 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  * xLock */      
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28b80 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20    UNLOCK,       
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ba0 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28bd0 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   CKLOCK,        
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28bf0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
28c00 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
28c10 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28c20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
28c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28c40 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
28c70 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  nixSectorSize,  
28c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
28c90 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20  ectorSize */    
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cb0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28cc0 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
28cd0 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65  ristics,  /* xDe
28ce0 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
28cf0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28d00 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28d10 78 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  xShmMap,        
28d20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
28d30 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Map */          
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d50 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28d60 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
28d70 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
28d80 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
28d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28da0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
28db0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
28dc0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
28dd0 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20  rrier */        
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
28e00 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mUnmap,         
28e10 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
28e20 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
28e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e40 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74      \.   unixFet
28e50 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
28e60 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a       /* xFetch *
28e70 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e90 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65     \.   unixUnfe
28ea0 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
28eb0 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20      /* xUnfetch 
28ec0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ee0 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20    \.};          
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f30 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
28f40 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28f50 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c  ds *FINDER##Impl
28f60 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
28f70 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20  unixFile *p){   
28f80 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  \.  UNUSED_PARAM
28f90 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f  ETER(z); UNUSED_
28fa0 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20  PARAMETER(p);   
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28fd0 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f  .  return &METHO
28fe0 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29020 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
29030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
29070 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
29080 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
29090 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28  (*const FINDER)(
290a0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
290b0 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20  File *p)    \.  
290c0 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c    = FINDER##Impl
290d0 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72  ;../*.** Here ar
290e0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c  e all of the sql
290f0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29100 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68  objects for each
29110 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69   of the.** locki
29120 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
29130 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72  Functions that r
29140 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74  eturn pointers t
29150 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a  o these methods.
29160 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61  ** are also crea
29170 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44  ted..*/.IOMETHOD
29180 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  S(.  posixIoFind
29190 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
291a0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
291b0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69  n name */.  posi
291c0 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  xIoMethods,     
291d0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
291e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
291f0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20  ct name */.  3, 
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
29220 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70   memory and mmap
29230 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   are enabled */.
29240 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
29250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29260 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
29270 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
29280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29290 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
292a0 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20   unixUnlock,    
292b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
292c0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
292d0 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
292e0 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78  vedLock     /* x
292f0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29300 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  k method */.).IO
29310 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63  METHODS(.  noloc
29320 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
29330 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
29340 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
29350 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64    nolockIoMethod
29360 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  s,          /* s
29370 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29380 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
29390 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
293a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
293b0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
293c0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e   disabled */.  n
293d0 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  olockClose,     
293e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
293f0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  se method */.  n
29400 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  olockLock,      
29410 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29420 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
29430 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
29440 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
29450 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
29460 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
29470 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65  edLock   /* xChe
29480 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
29490 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
294a0 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49  HODS(.  dotlockI
294b0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
294c0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
294d0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  tion name */.  d
294e0 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  otlockIoMethods,
294f0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
29500 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29510 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
29520 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
29530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
29540 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
29550 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c  sabled */.  dotl
29560 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
29570 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
29580 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
29590 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
295a0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
295b0 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
295c0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
295d0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
295e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
295f0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
29600 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52  Lock  /* xCheckR
29610 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
29620 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c  od */.)..#if SQL
29630 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
29640 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
29650 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44  VXWORKS.IOMETHOD
29660 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64  S(.  flockIoFind
29670 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
29680 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
29690 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63  n name */.  floc
296a0 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
296b0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
296c0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
296d0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
296e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296f0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
29700 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
29710 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c  led */.  flockCl
29720 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29730 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
29740 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f  hod */.  flockLo
29750 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29760 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
29770 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c  od */.  flockUnl
29780 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29790 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
297a0 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68  hod */.  flockCh
297b0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
297c0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
297d0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
297e0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
297f0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45   OS_VXWORKS.IOME
29800 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69  THODS(.  semIoFi
29810 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
29820 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
29830 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
29840 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  semIoMethods,   
29850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
29860 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29870 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
29880 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
29890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
298a0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
298b0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d  isabled */.  sem
298c0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
298d0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
298e0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
298f0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
29900 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
29910 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55  method */.  semU
29920 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
29930 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29940 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
29950 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29960 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
29970 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29980 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
29990 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
299a0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
299b0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
299c0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
299d0 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c  (.  afpIoFinder,
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
299f0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
29a00 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f   name */.  afpIo
29a10 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
29a20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
29a30 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
29a40 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
29a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a60 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
29a70 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
29a80 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65  ed */.  afpClose
29a90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29aa0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
29ab0 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c  od */.  afpLock,
29ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ad0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
29ae0 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b  d */.  afpUnlock
29af0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29b00 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
29b10 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b  od */.  afpCheck
29b20 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
29b30 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
29b40 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
29b50 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  /.).#endif../*.*
29b60 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
29b70 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20  ing method is a 
29b80 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69  "super-method" i
29b90 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74  n the sense that
29ba0 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63   it.** opens sec
29bb0 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63  ondary file desc
29bc0 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20  riptors for the 
29bd0 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66  conch and lock f
29be0 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75  iles and.** it u
29bf0 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66  ses proxy, dot-f
29c00 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c  ile, AFP, and fl
29c10 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65  ock() locking me
29c20 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a  thods on those.*
29c30 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  * secondary file
29c40 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  s.  For this rea
29c50 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
29c60 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
29c70 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s.** proxy locki
29c80 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75  ng is located mu
29c90 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20  ch further down 
29ca0 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75  in the file.  Bu
29cb0 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  t we need.** to 
29cc0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66  go ahead and def
29cd0 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ine the sqlite3_
29ce0 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66  io_methods and f
29cf0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a  inder function.*
29d00 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  * for proxy lock
29d10 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65  ing here.  So we
29d20 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65   forward declare
29d30 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
29d40 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
29d50 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
29d60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
29d70 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69  KING_STYLE.stati
29d80 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65  c int proxyClose
29d90 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b  (sqlite3_file*);
29da0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
29db0 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  yLock(sqlite3_fi
29dc0 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
29dd0 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63  c int proxyUnloc
29de0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
29df0 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
29e00 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65  t proxyCheckRese
29e10 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
29e20 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49  _file*, int*);.I
29e30 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78  OMETHODS(.  prox
29e40 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  yIoFinder,      
29e50 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
29e60 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
29e70 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  .  proxyIoMethod
29e80 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
29e90 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29ea0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
29eb0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ed0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
29ee0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
29ef0 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20  proxyClose,     
29f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
29f10 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
29f20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20  proxyLock,      
29f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
29f40 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
29f50 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  roxyUnlock,     
29f60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
29f70 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29f80 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
29f90 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68  edLock    /* xCh
29fa0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29fb0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
29fc0 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64  if../* nfs lockd
29fd0 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f   on OSX 10.3+ do
29fe0 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74  esn't clear writ
29ff0 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72  e locks when a r
2a000 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20  ead lock is set 
2a010 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
2a020 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2a030 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2a040 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
2a050 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65  DS(.  nfsIoFinde
2a060 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2a070 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2a080 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66  ion name */.  nf
2a090 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  sIoMethods,     
2a0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2a0b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2a0c0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
2a0d0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
2a0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2a0f0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2a100 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  isabled */.  uni
2a110 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
2a120 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
2a130 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
2a140 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
2a150 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2a160 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66  k method */.  nf
2a170 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  sUnlock,        
2a180 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2a190 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2a1a0 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
2a1b0 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
2a1c0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2a1d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2a1e0 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
2a1f0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2a200 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2a210 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a  KING_STYLE./* .*
2a220 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
2a230 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
2a240 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  s to determine t
2a250 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20  he best locking 
2a260 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72  strategy .** for
2a270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a280 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20  le "filePath".  
2a290 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20  It then returns 
2a2a0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
2a2b0 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
2a2c0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2a2d0 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a   that strategy..
2a2e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f  **.** This is fo
2a2f0 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a  r MacOSX only..*
2a300 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2a310 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a320 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
2a330 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
2a340 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
2a350 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
2a360 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a370 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2a380 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
2a390 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  * open file obje
2a3a0 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ct for the datab
2a3b0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ase file */.){. 
2a3c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
2a3d0 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20  ruct Mapping {. 
2a3e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2a3f0 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20  Filesystem;     
2a400 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2a410 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65  system type name
2a420 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71   */.    const sq
2a430 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a440 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a   *pMethods;   /*
2a450 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   Appropriate loc
2a460 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  king method */. 
2a470 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20   } aMap[] = {.  
2a480 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70    { "hfs",    &p
2a490 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
2a4a0 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20  .    { "ufs",   
2a4b0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2a4c0 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73   },.    { "afpfs
2a4d0 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
2a4e0 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66  s },.    { "smbf
2a4f0 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
2a500 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62  ds },.    { "web
2a510 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  dav", &nolockIoM
2a520 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2a530 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e  0, 0 }.  };.  in
2a540 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
2a550 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73  atfs fsInfo;.  s
2a560 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
2a570 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
2a580 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
2a590 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
2a5a0 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
2a5b0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2a5c0 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
2a5d0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
2a5e0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2a5f0 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
2a600 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
2a610 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20  IoMethods;.  }. 
2a620 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65   if( statfs(file
2a630 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21  Path, &fsInfo) !
2a640 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  = -1 ){.    if( 
2a650 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26  fsInfo.f_flags &
2a660 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20   MNT_RDONLY ){. 
2a670 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c       return &nol
2a680 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2a690 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
2a6a0 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
2a6b0 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  stem; i++){.    
2a6c0 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49    if( strcmp(fsI
2a6d0 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2a6e0 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  , aMap[i].zFiles
2a6f0 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  ystem)==0 ){.   
2a700 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70       return aMap
2a710 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20  [i].pMethods;.  
2a720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2a730 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61  .  /* Default ca
2a740 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f  se. Handles, amo
2a750 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66  ngst others, "nf
2a760 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79  s"..  ** Test by
2a770 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73  te-range lock us
2a780 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20  ing fcntl(). If 
2a790 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64  the call succeed
2a7a0 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  s, .  ** assume 
2a7b0 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79  that the file-sy
2a7c0 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f  stem supports PO
2a7d0 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
2a7e0 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66   .  */.  lockInf
2a7f0 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
2a800 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
2a810 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
2a820 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
2a830 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
2a840 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
2a850 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
2a860 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
2a870 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
2a880 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72   ) {.    if( str
2a890 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
2a8a0 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d  ypename, "nfs")=
2a8b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
2a8c0 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  rn &nfsIoMethods
2a8d0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
2a8e0 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73       return &pos
2a8f0 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ixIoMethods;.   
2a900 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2a910 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49  return &dotlockI
2a920 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
2a930 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2a940 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a950 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
2a960 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
2a970 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
2a980 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
2a990 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
2a9a0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
2a9b0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2a9c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2a9d0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
2a9e0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  f OS_VXWORKS && 
2a9f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2aa00 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
2aa10 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
2aa20 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
2aa30 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
2aa40 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
2aa50 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
2aa60 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2aa70 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
2aa80 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
2aa90 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
2aaa0 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
2aab0 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
2aac0 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
2aad0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
2aae0 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e  or VXWorks only.
2aaf0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2ab00 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2ab10 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
2ab20 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
2ab30 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
2ab40 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
2ab50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ab60 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
2ab70 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
2ab80 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   /* the open fil
2ab90 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
2aba0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
2abb0 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
2abc0 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
2abd0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
2abe0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
2abf0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
2ac00 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
2ac10 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
2ac20 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2ac30 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
2ac40 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
2ac50 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2ac60 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66  ..  /* Test if f
2ac70 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72  cntl() is suppor
2ac80 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49  ted and use POSI
2ac90 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20  X style locks.. 
2aca0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61   ** Otherwise fa
2acb0 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e  ll back to the n
2acc0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d  amed semaphore m
2acd0 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  ethod..  */.  lo
2ace0 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
2acf0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
2ad00 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
2ad10 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
2ad20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
2ad30 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
2ad40 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
2ad50 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
2ad60 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
2ad70 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65  )!=-1 ) {.    re
2ad80 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
2ad90 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2ada0 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f     return &semIo
2adb0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
2adc0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2add0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
2ade0 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c    *(*const autol
2adf0 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
2ae00 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2ae10 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f  e*) = autolockIo
2ae20 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
2ae30 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
2ae40 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  S && SQLITE_ENAB
2ae50 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2ae60 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62   */../*.** An ab
2ae70 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20  stract type for 
2ae80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49  a pointer to a I
2ae90 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
2aea0 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70  function:.*/.typ
2aeb0 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74  edef const sqlit
2aec0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
2aed0 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f  *finder_type)(co
2aee0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
2aef0 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  le*);.../*******
2af00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af40 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2af50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af60 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
2af70 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
2af80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af90 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
2afa0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
2afb0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2afc0 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
2afd0 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
2afe0 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
2aff0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2b000 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2b010 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  f the unixFile s
2b020 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
2b030 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73   to by pId..*/.s
2b040 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
2b050 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69  UnixFile(.  sqli
2b060 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2b070 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2b080 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
2b090 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
2b0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2b0b0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
2b0c0 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
2b0d0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
2b0e0 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20  te3_file *pId,  
2b0f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
2b100 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
2b110 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2b120 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2b130 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
2b140 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   of the file bei
2b150 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
2b160 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20  nt ctrlFlags    
2b170 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f         /* Zero o
2b180 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f  r more UNIXFILE_
2b190 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  * values */.){. 
2b1a0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2b1b0 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b  o_methods *pLock
2b1c0 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78  ingStyle;.  unix
2b1d0 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e  File *pNew = (un
2b1e0 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20  ixFile *)pId;.  
2b1f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2b200 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2b210 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c  New->pInode==NUL
2b220 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c  L );..  /* Usual
2b230 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c  ly the path zFil
2b240 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74  ename should not
2b250 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70   be a relative p
2b260 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a  athname. The.  *
2b270 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  * exception is w
2b280 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
2b290 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69  proxy "conch" fi
2b2a0 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61  le in builds tha
2b2b0 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74  t.  ** include t
2b2c0 68 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65  he special Apple
2b2d0 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e   locking styles.
2b2e0 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
2b2f0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2b300 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2b310 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73  CKING_STYLE.  as
2b320 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
2b330 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
2b340 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20  0]=='/' .    || 
2b350 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d  pVfs->pAppData==
2b360 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
2b370 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73  IoFinder );.#els
2b380 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  e.  assert( zFil
2b390 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
2b3a0 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  ename[0]=='/' );
2b3b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f  .#endif..  /* No
2b3c0 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20   locking occurs 
2b3d0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  in temporary fil
2b3e0 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
2b3f0 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20  zFilename!=0 || 
2b400 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2b410 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30  XFILE_NOLOCK)!=0
2b420 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
2b430 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
2b440 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
2b450 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d  e));.  pNew->h =
2b460 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73   h;.  pNew->pVfs
2b470 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d   = pVfs;.  pNew-
2b480 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  >zPath = zFilena
2b490 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c  me;.  pNew->ctrl
2b4a0 46 6c 61 67 73 20 3d 20 28 75 6e 73 69 67 6e 65  Flags = (unsigne
2b4b0 64 20 73 68 6f 72 74 29 63 74 72 6c 46 6c 61 67  d short)ctrlFlag
2b4c0 73 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  s;.  if( strcmp(
2b4d0 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69  pVfs->zName,"uni
2b4e0 78 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20  x-excl")==0 ){. 
2b4f0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2b500 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45  gs |= UNIXFILE_E
2b510 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53  XCL;.  }..#if OS
2b520 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d  _VXWORKS.  pNew-
2b530 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69  >pId = vxworksFi
2b540 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61  ndFileId(zFilena
2b550 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  me);.  if( pNew-
2b560 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63  >pId==0 ){.    c
2b570 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2b580 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20  FILE_NOLOCK;.   
2b590 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2b5a0 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  EM;.  }.#endif..
2b5b0 20 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20    if( ctrlFlags 
2b5c0 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  & UNIXFILE_NOLOC
2b5d0 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  K ){.    pLockin
2b5e0 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b  gStyle = &nolock
2b5f0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
2b600 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67  se{.    pLocking
2b610 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64  Style = (**(find
2b620 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70  er_type*)pVfs->p
2b630 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61  AppData)(zFilena
2b640 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53  me, pNew);.#if S
2b650 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2b660 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f  KING_STYLE.    /
2b670 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d  * Cache zFilenam
2b680 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e in the locking
2b690 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e   context (AFP an
2b6a0 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69  d dotlock overri
2b6b0 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  de) for.    ** p
2b6c0 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74  roxyLock activat
2b6d0 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ion is possible 
2b6e0 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73  (remote proxy is
2b6f0 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d   based on db nam
2b700 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e  e).    ** zFilen
2b710 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  ame remains vali
2b720 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20  d until file is 
2b730 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f  closed, to suppo
2b740 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  rt */.    pNew->
2b750 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2b760 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d   (void*)zFilenam
2b770 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  e;.#endif.  }.. 
2b780 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
2b790 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65  le == &posixIoMe
2b7a0 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65  thods.#if define
2b7b0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2b7c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2b7d0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
2b7e0 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  || pLockingStyle
2b7f0 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64   == &nfsIoMethod
2b800 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  s.#endif.  ){.  
2b810 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2b820 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
2b830 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
2b840 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
2b850 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2b860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b870 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2b880 63 63 75 72 72 65 64 20 69 6e 20 66 69 6e 64 49  ccurred in findI
2b890 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73  nodeInfo(), clos
2b8a0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
2b8b0 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  iptor.      ** i
2b8c0 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f  mmediately, befo
2b8d0 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  re releasing the
2b8e0 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64   mutex. findInod
2b8f0 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c  eInfo() may fail
2b900 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f  .      ** in two
2b910 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20   scenarios:.    
2b920 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
2b930 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73  (a) A call to fs
2b940 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20  tat() failed..  
2b950 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d      **   (b) A m
2b960 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20  alloc failed..  
2b970 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2b980 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79  Scenario (b) may
2b990 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74   only occur if t
2b9a0 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  he process is ho
2b9b0 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20  lding no other. 
2b9c0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73       ** file des
2b9d0 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e  criptors open on
2b9e0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20   the same file. 
2b9f0 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f 74  If there were ot
2ba00 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  her file.      *
2ba10 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e  * descriptors on
2ba20 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e   this file, then
2ba30 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64   no malloc would
2ba40 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79 0a   be required by.
2ba50 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f        ** findIno
2ba60 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69  deInfo(). If thi
2ba70 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69  s is the case, i
2ba80 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65 20  t is quite safe 
2ba90 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a  to close.      *
2baa0 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20  * handle h - as 
2bab0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
2bac0 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c   that no posix l
2bad0 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c  ocks will be rel
2bae0 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  eased.      ** b
2baf0 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20  y doing so..    
2bb00 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
2bb10 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61   scenario (a) ca
2bb20 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20 74  used the error t
2bb30 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e  hen things are n
2bb40 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a  ot so safe. The.
2bb50 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69        ** implici
2bb60 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72  t assumption her
2bb70 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73 74  e is that if fst
2bb80 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e  at() fails, thin
2bb90 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20  gs are in.      
2bba0 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61 70  ** such bad shap
2bbb0 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20  e that dropping 
2bbc0 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f  a lock or two do
2bbd0 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63  esn't matter muc
2bbe0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
2bbf0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2bc00 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2bc10 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  );.      h = -1;
2bc20 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
2bc30 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
2bc40 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
2bc50 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2bc60 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
2bc70 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69  PPLE__).  else i
2bc80 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2bc90 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
2bca0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20  s ){.    /* AFP 
2bcb0 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
2bcc0 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
2bcd0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
2bce0 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
2bcf0 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  the afpLockingCo
2bd00 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ntext..    */.  
2bd10 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
2bd20 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70  ext *pCtx;.    p
2bd30 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2bd40 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c  ext = pCtx = sql
2bd50 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
2bd60 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20  eof(*pCtx) );.  
2bd70 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b    if( pCtx==0 ){
2bd80 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2bd90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
2bda0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42  lse{.      /* NB
2bdb0 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73  : zFilename exis
2bdc0 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76  ts and remains v
2bdd0 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66  alid until the f
2bde0 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20  ile is closed.  
2bdf0 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67      ** according
2be00 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20   to requirement 
2be10 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64  F11141.  So we d
2be20 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61  o not need to ma
2be30 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ke a.      ** co
2be40 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  py of the filena
2be50 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74  me. */.      pCt
2be60 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c  x->dbPath = zFil
2be70 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74  ename;.      pCt
2be80 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b  x->reserved = 0;
2be90 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65  .      srandomde
2bea0 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45  v();.      unixE
2beb0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
2bec0 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
2bed0 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
2bee0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
2bef0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2bf00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
2bf10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
2bf20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2bf30 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73  );.        robus
2bf40 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2bf50 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2bf60 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
2bf70 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65    }.      unixLe
2bf80 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20  aveMutex();     
2bf90 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65     .    }.  }.#e
2bfa0 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28  ndif..  else if(
2bfb0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2bfc0 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
2bfd0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ods ){.    /* Do
2bfe0 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73  tfile locking us
2bff0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2c000 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2c010 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
2c020 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63     ** the dotloc
2c030 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
2c040 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
2c050 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20   *zLockFile;.   
2c060 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a   int nFilename;.
2c070 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c      assert( zFil
2c080 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  ename!=0 );.    
2c090 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74  nFilename = (int
2c0a0 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d  )strlen(zFilenam
2c0b0 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63  e) + 6;.    zLoc
2c0c0 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
2c0d0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
2c0e0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
2c0f0 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
2c100 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2c110 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2c120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2c130 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46  ite3_snprintf(nF
2c140 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69  ilename, zLockFi
2c150 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b  le, "%s" DOTLOCK
2c160 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61  _SUFFIX, zFilena
2c170 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
2c180 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2c190 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b  ext = zLockFile;
2c1a0 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
2c1b0 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20  ORKS.  else if( 
2c1c0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2c1d0 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29   &semIoMethods )
2c1e0 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73  {.    /* Named s
2c1f0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
2c200 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
2c210 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
2c220 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63  to be.    ** inc
2c230 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d  luded in the sem
2c240 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20  LockingContext. 
2c250 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e     */.    unixEn
2c260 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
2c270 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2c280 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2c290 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
2c2a0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
2c2b0 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64   && (pNew->pInod
2c2c0 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29  e->pSem==NULL) )
2c2d0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
2c2e0 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70  emName = pNew->p
2c2f0 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b  Inode->aSemName;
2c300 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
2c310 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2c320 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
2c330 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25  E, zSemName, "/%
2c340 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20  s.sem",.        
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c360 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  New->pId->zCanon
2c370 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  icalName);.     
2c380 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e   for( n=1; zSemN
2c390 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20  ame[n]; n++ ).  
2c3a0 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61        if( zSemNa
2c3b0 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65  me[n]=='/' ) zSe
2c3c0 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a  mName[n] = '_';.
2c3d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
2c3e0 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f  de->pSem = sem_o
2c3f0 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f  pen(zSemName, O_
2c400 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b  CREAT, 0666, 1);
2c410 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
2c420 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d  >pInode->pSem ==
2c430 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
2c440 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2c450 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2c460 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
2c470 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
2c480 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
2c490 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2c4a0 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
2c4b0 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61  if.  .  pNew->la
2c4c0 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66  stErrno = 0;.#if
2c4d0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
2c4e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c4f0 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
2c500 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
2c510 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2c520 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  );.    h = -1;. 
2c530 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c     osUnlink(zFil
2c540 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  ename);.    pNew
2c550 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
2c560 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a  NIXFILE_DELETE;.
2c570 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
2c580 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c590 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
2c5a0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2c5b0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2c5c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2c5d0 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  New->pMethod = p
2c5e0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
2c5f0 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70    verifyDbFile(p
2c600 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  New);.  }.  retu
2c610 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c620 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
2c630 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  of a directory i
2c640 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74  n which to put t
2c650 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
2c660 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c  ** If no suitabl
2c670 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
2c680 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62   directory can b
2c690 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
2c6a0 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
2c6b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
2c6c0 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64  TempFileDir(void
2c6d0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
2c6e0 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
2c6f0 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
2c700 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20    0,.     0,.   
2c710 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
2c720 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
2c730 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
2c740 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73   0        /* Lis
2c750 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a  t terminator */.
2c760 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
2c770 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2c780 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73  stat buf;.  cons
2c790 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30  t char *zDir = 0
2c7a0 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d  ;..  azDirs[0] =
2c7b0 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
2c7c0 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21  rectory;.  if( !
2c7d0 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69  azDirs[1] ) azDi
2c7e0 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
2c7f0 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b  SQLITE_TMPDIR");
2c800 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32  .  if( !azDirs[2
2c810 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20  ] ) azDirs[2] = 
2c820 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
2c830 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
2c840 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
2c850 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
2c860 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b   zDir=azDirs[i++
2c870 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72  ]){.    if( zDir
2c880 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2c890 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a      if( osStat(z
2c8a0 44 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e  Dir, &buf) ) con
2c8b0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
2c8c0 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
2c8d0 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ode) ) continue;
2c8e0 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73  .    if( osAcces
2c8f0 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f  s(zDir, 07) ) co
2c900 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61  ntinue;.    brea
2c910 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2c920 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  zDir;.}../*.** C
2c930 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
2c940 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
2c950 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
2c960 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  be allocated.** 
2c970 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  by the calling p
2c980 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20  rocess and must 
2c990 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
2c9a0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a   hold at least.*
2c9b0 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  * pVfs->mxPathna
2c9c0 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  me bytes..*/.sta
2c9d0 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
2c9e0 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
2c9f0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2ca00 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
2ca10 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61  signed char zCha
2ca20 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
2ca30 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
2ca40 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
2ca50 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
2ca60 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
2ca70 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73  23456789";.  uns
2ca80 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a  igned int i, j;.
2ca90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2caa0 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  ir;..  /* It's o
2cab0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
2cac0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
2cad0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
2cae0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
2caf0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
2cb00 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
2cb10 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
2cb20 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
2cb30 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
2cb40 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20  ailing. .  */.  
2cb50 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2cb60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2cb70 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20  OERR );..  zDir 
2cb80 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69  = unixTempFileDi
2cb90 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d  r();.  if( zDir=
2cba0 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b  =0 ) zDir = ".";
2cbb0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
2cbc0 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  t the output buf
2cbd0 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  fer is large eno
2cbe0 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70  ugh for the temp
2cbf0 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a  orary file .  **
2cc00 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20   name. If it is 
2cc10 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  not, return SQLI
2cc20 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20  TE_ERROR..  */. 
2cc30 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69   if( (strlen(zDi
2cc40 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49  r) + strlen(SQLI
2cc50 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
2cc60 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 28 73  FIX) + 18) >= (s
2cc70 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20  ize_t)nBuf ){.  
2cc80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cc90 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f  ERROR;.  }..  do
2cca0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2ccb0 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20  printf(nBuf-18, 
2ccc0 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54  zBuf, "%s/"SQLIT
2ccd0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
2cce0 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a  IX, zDir);.    j
2ccf0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
2cd00 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Buf);.    sqlite
2cd10 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  3_randomness(15,
2cd20 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20   &zBuf[j]);.    
2cd30 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
2cd40 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, j++){.      
2cd50 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
2cd60 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
2cd70 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
2cd80 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
2cd90 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  -1) ];.    }.   
2cda0 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
2cdb0 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b    zBuf[j+1] = 0;
2cdc0 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63  .  }while( osAcc
2cdd0 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29  ess(zBuf,0)==0 )
2cde0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2cdf0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
2ce00 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ce10 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
2ce20 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
2ce30 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  *.** Routine to 
2ce40 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78  transform a unix
2ce50 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78  File into a prox
2ce60 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69  y-locking unixFi
2ce70 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  le..** Implement
2ce80 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f  ation in the pro
2ce90 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e  xy-lock division
2cea0 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e  , but used by un
2ceb0 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53  ixOpen().** if S
2cec0 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
2ced0 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65  XY_LOCKING is de
2cee0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
2cef0 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66   int proxyTransf
2cf00 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ormUnixFile(unix
2cf10 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61  File*, const cha
2cf20 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r*);.#endif../*.
2cf30 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  ** Search for an
2cf40 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
2cf50 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73  criptor that was
2cf60 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64   opened on the d
2cf70 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
2cf80 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20   (not a journal 
2cf90 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  or master-journa
2cfa0 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69  l file) identifi
2cfb0 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a  ed by pathname.*
2cfc0 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c  * zPath with SQL
2cfd0 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
2cfe0 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73  gs matching thos
2cff0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2d000 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
2d010 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2d020 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20  ion..**.** Such 
2d030 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
2d040 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61  r may exist if a
2d050 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2d060 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a  tion was closed.
2d070 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63  ** but the assoc
2d080 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72  iated file descr
2d090 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20  iptor could not 
2d0a0 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73  be closed becaus
2d0b0 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  e some.** other 
2d0c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2d0d0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2d0e0 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67   file is holding
2d0f0 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a   a file-lock..**
2d100 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e   Refer to commen
2d110 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c  ts in the unixCl
2d120 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ose() function a
2d130 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63  nd the lengthy c
2d140 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69  omment.** descri
2d150 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69  bing "Posix Advi
2d160 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74  sory Locking" at
2d170 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2d180 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20  is file for .** 
2d190 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e  further details.
2d1a0 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34   Also, ticket #4
2d1b0 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  018..**.** If a 
2d1c0 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65  suitable file de
2d1d0 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e  scriptor is foun
2d1e0 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65  d, then it is re
2d1f0 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a  turned. If no.**
2d200 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72   such file descr
2d210 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64  iptor is located
2d220 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
2d230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78  ..*/.static Unix
2d240 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65  UnusedFd *findRe
2d250 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63  usableFd(const c
2d260 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20  har *zPath, int 
2d270 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e  flags){.  UnixUn
2d280 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
2d290 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  = 0;..  /* Do no
2d2a0 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20  t search for an 
2d2b0 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
2d2c0 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b  riptor on vxwork
2d2d0 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20  s. Not because. 
2d2e0 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c   ** vxworks woul
2d2f0 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72  d not benefit fr
2d300 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69  om the change (i
2d310 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e  t might, we're n
2d320 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62  ot sure),.  ** b
2d330 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61  ut because no wa
2d340 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20  y to test it is 
2d350 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
2d360 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65  ble. It is bette
2d370 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72  r .  ** not to r
2d380 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77  isk breaking vxw
2d390 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72  orks support for
2d3a0 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63   the sake of suc
2d3b0 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20  h an obscure .  
2d3c0 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a  ** feature.  */.
2d3d0 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
2d3e0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2d3f0 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
2d400 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
2d410 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c  s of stat() call
2d420 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74   */..  /* A stat
2d430 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c  () call may fail
2d440 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61   for various rea
2d450 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61  sons. If this ha
2d460 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a  ppens, it is.  *
2d470 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  * almost certain
2d480 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20   that an open() 
2d490 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65  call on the same
2d4a0 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20   path will also 
2d4b0 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74  fail..  ** For t
2d4c0 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61  his reason, if a
2d4d0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
2d4e0 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c  n the stat() cal
2d4f0 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20  l here, it is.  
2d500 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d  ** ignored and -
2d510 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  1 is returned. T
2d520 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74  he caller will t
2d530 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77  ry to open a new
2d540 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72   file.  ** descr
2d550 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d  iptor on the sam
2d560 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e  e path, fail, an
2d570 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  d return an erro
2d580 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a  r to SQLite..  *
2d590 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61  *.  ** Even if a
2d5a0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e   subsequent open
2d5b0 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63  () call does suc
2d5c0 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71  ceed, the conseq
2d5d0 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e  uences of.  ** n
2d5e0 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  ot searching for
2d5f0 20 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c   a resusable fil
2d600 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
2d610 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20   not dire.  */. 
2d620 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
2d630 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
2d640 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
2d650 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20  fo *pInode;..   
2d660 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2d670 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  );.    pInode = 
2d680 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  inodeList;.    w
2d690 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
2d6a0 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  (pInode->fileId.
2d6b0 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
2d6c0 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
2d6d0 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65         || pInode
2d6e0 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53  ->fileId.ino!=sS
2d6f0 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20  tat.st_ino) ){. 
2d700 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70        pInode = p
2d710 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
2d720 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f    }.    if( pIno
2d730 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78  de ){.      Unix
2d740 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20  UnusedFd **pp;. 
2d750 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e       for(pp=&pIn
2d760 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70  ode->pUnused; *p
2d770 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67  p && (*pp)->flag
2d780 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28  s!=flags; pp=&((
2d790 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20  *pp)->pNext));. 
2d7a0 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a       pUnused = *
2d7b0 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55  pp;.      if( pU
2d7c0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
2d7d0 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e   *pp = pUnused->
2d7e0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2d7f0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
2d800 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
2d810 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21  endif    /* if !
2d820 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20  OS_VXWORKS */.  
2d830 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a  return pUnused;.
2d840 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2d850 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2d860 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74   by unixOpen() t
2d870 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
2d880 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73  unix permissions
2d890 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65  .** to create ne
2d8a0 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66  w files with. If
2d8b0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2d8c0 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
2d8d0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
2d8e0 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74  and a value suit
2d8f0 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67  able for passing
2d900 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
2d910 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32  gument to open(2
2d920 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ) is.** written 
2d930 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e  to *pMode. If an
2d940 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2d950 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
2d960 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
2d970 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
2d980 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69  alue of *pMode i
2d990 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a  s not modified..
2d9a0 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61  **.** In most ca
2d9b0 73 65 73 20 63 61 73 65 73 2c 20 74 68 69 73 20  ses cases, this 
2d9c0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d  routine sets *pM
2d9d0 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20  ode to 0, which 
2d9e0 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61  will become.** a
2d9f0 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
2da00 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f  robust_open() to
2da10 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65   create the file
2da20 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45   using.** SQLITE
2da30 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
2da40 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74  RMISSIONS adjust
2da50 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
2da60 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66  .** But if the f
2da70 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2da80 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67   is a WAL or reg
2da90 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
2daa0 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
2dab0 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65   function querie
2dac0 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
2dad0 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73  m for the permis
2dae0 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a  sions on the .**
2daf0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64   corresponding d
2db00 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2db10 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20   sets *pMode to 
2db20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e  this value. When
2db30 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c  ever .** possibl
2db40 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e  e, WAL and journ
2db50 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  al files are cre
2db60 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ated using the s
2db70 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ame permissions 
2db80 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63  .** as the assoc
2db90 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
2dba0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
2dbb0 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
2dbc0 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e  8_3_NAMES option
2dbd0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
2dbe0 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  n the.** origina
2dbf0 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e  l filename is un
2dc00 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20  available.  But 
2dc10 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c  8_3_NAMES is onl
2dc20 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41  y used for.** FA
2dc30 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e  T filesystems an
2dc40 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f  d permissions do
2dc50 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72   not matter ther
2dc60 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a  e, so just use.*
2dc70 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65  * the default pe
2dc80 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  rmissions..*/.st
2dc90 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65  atic int findCre
2dca0 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63  ateFileMode(.  c
2dcb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2dcc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2dcd0 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28  * Path of file (
2dce0 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20  possibly) being 
2dcf0 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  created */.  int
2dd00 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dd20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20  Flags passed as 
2dd30 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  4th argument to 
2dd40 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64  xOpen() */.  mod
2dd50 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20  e_t *pMode,     
2dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dd70 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73  OUT: Permissions
2dd80 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69   to open file wi
2dd90 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70  th */.  uid_t *p
2dda0 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uid,            
2ddb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2ddc0 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68  uid to set on th
2ddd0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f  e file */.  gid_
2dde0 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20  t *pGid         
2ddf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2de00 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f  UT: gid to set o
2de10 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  n the file */.){
2de20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2de30 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2de40 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2de50 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20  e */.  *pMode = 
2de60 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a  0;.  *pUid = 0;.
2de70 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69    *pGid = 0;.  i
2de80 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
2de90 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
2dea0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2deb0 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61  RNAL) ){.    cha
2dec0 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41  r zDb[MAX_PATHNA
2ded0 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61  ME+1];     /* Da
2dee0 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68  tabase file path
2def0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b   */.    int nDb;
2df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2df20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69  of valid bytes i
2df30 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72  n zDb */.    str
2df40 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
2df50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2df60 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f  tput of stat() o
2df70 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2df80 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68  */..    /* zPath
2df90 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20   is a path to a 
2dfa0 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  WAL or journal f
2dfb0 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ile. The followi
2dfc0 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73  ng block derives
2dfd0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68  .    ** the path
2dfe0 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
2dff0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
2e000 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69   from zPath. Thi
2e010 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a  s block handles.
2e020 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
2e030 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76  wing naming conv
2e040 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a  entions:.    **.
2e050 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2e060 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a  to db>-journal".
2e070 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2e080 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20  to db>-wal".    
2e090 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2e0a0 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20  b>-journalNN".  
2e0b0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2e0c0 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20   db>-walNN".    
2e0d0 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20  **.    ** where 
2e0e0 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20  NN is a decimal 
2e0f0 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e  number. The NN n
2e100 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72  aming schemes ar
2e110 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62  e .    ** used b
2e120 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69  y the test_multi
2e130 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20  plex.c module.. 
2e140 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20     */.    nDb = 
2e150 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2e160 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66  zPath) - 1; .#if
2e170 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2e180 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20  E_8_3_NAMES.    
2e190 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20  while( nDb>0 && 
2e1a0 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
2e1b0 50 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62  Path[nDb]) ) nDb
2e1c0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d  --;.    if( nDb=
2e1d0 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d  =0 || zPath[nDb]
2e1e0 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53  !='-' ) return S
2e1f0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
2e200 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68      while( zPath
2e210 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20  [nDb]!='-' ){.  
2e220 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e      assert( nDb>
2e230 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2e240 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  t( zPath[nDb]!='
2e250 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62  \n' );.      nDb
2e260 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  --;.    }.#endif
2e270 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c  .    memcpy(zDb,
2e280 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20   zPath, nDb);.  
2e290 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30    zDb[nDb] = '\0
2e2a0 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f  ';..    if( 0==o
2e2b0 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61  sStat(zDb, &sSta
2e2c0 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f  t) ){.      *pMo
2e2d0 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f  de = sStat.st_mo
2e2e0 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20  de & 0777;.     
2e2f0 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73   *pUid = sStat.s
2e300 74 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47  t_uid;.      *pG
2e310 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69  id = sStat.st_gi
2e320 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
2e330 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e340 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
2e350 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66   }.  }else if( f
2e360 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2e370 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2e380 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d   ){.    *pMode =
2e390 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74   0600;.  }.  ret
2e3a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e3b0 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a   Open the file z
2e3c0 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65  Path..** .** Pre
2e3d0 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c  viously, the SQL
2e3e0 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65  ite OS layer use
2e3f0 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  d three function
2e400 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
2e410 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a  is.** one:.**.**
2e420 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2e430 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a  enReadWrite();.*
2e440 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
2e450 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a  penReadOnly();.*
2e460 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
2e470 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a  penExclusive();.
2e480 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
2e490 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  s correspond to 
2e4a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
2e4b0 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c  mbinations of fl
2e4c0 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  ags:.**.**     R
2e4d0 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20  eadWrite() ->   
2e4e0 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43    (READWRITE | C
2e4f0 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65  REATE).**     Re
2e500 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20  adOnly()  ->    
2e510 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20   (READONLY) .** 
2e520 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76      OpenExclusiv
2e530 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54  e() -> (READWRIT
2e540 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43  E | CREATE | EXC
2e550 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68  LUSIVE).**.** Th
2e560 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73  e old OpenExclus
2e570 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61  ive() accepted a
2e580 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e   boolean argumen
2e590 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49  t - "delFlag". I
2e5a0 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66  f.** true, the f
2e5b0 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72  ile was configur
2e5c0 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74  ed to be automat
2e5d0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
2e5e0 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  hen the.** file 
2e5f0 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54  handle closed. T
2e600 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61  o achieve the sa
2e610 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20  me effect using 
2e620 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74  this new .** int
2e630 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20  erface, add the 
2e640 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c  DELETEONCLOSE fl
2e650 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  ag to those spec
2e660 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20  ified above for 
2e670 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  .** OpenExclusiv
2e680 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
2e690 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73  nt unixOpen(.  s
2e6a0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2e6b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2e6c0 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68  he VFS for which
2e6d0 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70   this is the xOp
2e6e0 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  en method */.  c
2e6f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2e700 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
2e710 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20  athname of file 
2e720 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
2e730 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2e740 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  pFile,         /
2e750 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
2e760 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c  iptor to be fill
2e770 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66  ed in */.  int f
2e780 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2e790 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
2e7a0 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f   flags to contro
2e7b0 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f  l the opening */
2e7c0 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
2e7d0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2e7e0 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20  /* Output flags 
2e7f0 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
2e800 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20  te core */.){.  
2e810 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
2e820 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  nixFile *)pFile;
2e830 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20  .  int fd = -1; 
2e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e850 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2e860 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  ptor returned by
2e870 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
2e880 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20   openFlags = 0; 
2e890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2e8a0 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
2e8b0 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
2e8c0 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
2e8d0 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
2e8e0 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
2e8f0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f  en */.  int noLo
2e900 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
2e910 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2e920 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70  o omit locking p
2e930 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69  rimitives */.  i
2e940 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e950 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
2e960 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
2e970 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   Code */.  int c
2e980 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  trlFlags;       
2e990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49            /* UNI
2e9a0 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  XFILE_* flags */
2e9b0 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
2e9c0 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
2e9d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
2e9e0 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
2e9f0 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
2ea00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2ea10 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
2ea20 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
2ea30 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
2ea40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2ea50 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
2ea60 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
2ea70 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
2ea80 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
2ea90 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
2eaa0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2eab0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
2eac0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2ead0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2eae0 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78    int isAutoProx
2eaf0 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  y  = (flags & SQ
2eb00 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
2eb10 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  OXY);.#endif.#if
2eb20 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2eb30 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  __) || SQLITE_EN
2eb40 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2eb50 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  LE.  struct stat
2eb60 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69  fs fsInfo;.#endi
2eb70 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74  f..  /* If creat
2eb80 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20  ing a master or 
2eb90 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61  main-file journa
2eba0 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  l, this function
2ebb0 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20   will open.  ** 
2ebc0 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  a file-descripto
2ebd0 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f  r on the directo
2ebe0 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73  ry too. The firs
2ebf0 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28  t time unixSync(
2ec00 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ).  ** is called
2ec10 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   the directory f
2ec20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
2ec30 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64  ill be fsync()ed
2ec40 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20   and close()d.. 
2ec50 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
2ec60 72 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  r = (isCreate &&
2ec70 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
2ec80 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2ec90 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
2eca0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2ecb0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2ecc0 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
2ecd0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2ece0 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f  N_WAL.  ));..  /
2ecf0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
2ed00 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
2ed10 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
2ed20 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
2ed30 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
2ed40 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
2ed50 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
2ed60 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
2ed70 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
2ed80 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b    char zTmpname[
2ed90 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
2eda0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2edb0 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20  Name = zPath;.. 
2edc0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f   assert( p->pIno
2edd0 64 65 3d 3d 30 20 26 26 20 28 70 2d 3e 68 3d 3d  de==0 && (p->h==
2ede0 2d 31 20 7c 7c 20 70 2d 3e 68 3d 3d 30 29 20 29  -1 || p->h==0) )
2edf0 3b 0a 20 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73  ;.  p->ctrlFlags
2ee00 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 45   &= ~UNIXFILE_DE
2ee10 46 45 52 52 45 44 3b 0a 20 20 70 2d 3e 65 46 69  FERRED;.  p->eFi
2ee20 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
2ee30 3b 0a 20 20 63 74 72 6c 46 6c 61 67 73 20 3d 20  ;.  ctrlFlags = 
2ee40 70 2d 3e 63 74 72 6c 46 6c 61 67 73 3b 0a 0a 20  p->ctrlFlags;.. 
2ee50 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
2ee60 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
2ee70 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
2ee80 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
2ee90 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
2eea0 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
2eeb0 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
2eec0 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
2eed0 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
2eee0 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
2eef0 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
2ef00 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
2ef10 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
2ef20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
2ef30 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
2ef40 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
2ef50 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
2ef60 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
2ef70 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
2ef80 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
2ef90 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2efa0 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
2efb0 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
2efc0 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
2efd0 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
2efe0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
2eff0 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
2f000 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
2f010 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
2f020 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
2f030 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
2f040 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
2f050 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
2f060 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
2f070 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
2f080 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
2f090 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
2f0a0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
2f0b0 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
2f0c0 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
2f0d0 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
2f0e0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2f0f0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2f100 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2f110 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
2f120 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2f130 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2f140 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2f150 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
2f160 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
2f170 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2f180 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2f190 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
2f1a0 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
2f1b0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2f1c0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2f1d0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
2f1e0 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
2f1f0 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
2f200 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
2f210 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
2f220 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
2f230 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
2f240 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2f250 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
2f260 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2f270 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
2f280 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f290 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2f2a0 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
2f2b0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
2f2c0 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
2f2d0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f2e0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
2f2f0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2f300 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
2f310 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
2f320 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f330 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
2f340 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2f350 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
2f360 0a 20 20 2f 2a 20 44 65 74 65 63 74 20 61 20 70  .  /* Detect a p
2f370 69 64 20 63 68 61 6e 67 65 20 61 6e 64 20 72 65  id change and re
2f380 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 54  set the PRNG.  T
2f390 68 65 72 65 20 69 73 20 61 20 72 61 63 65 20 63  here is a race c
2f3a0 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65  ondition.  ** he
2f3b0 72 65 20 73 75 63 68 20 74 68 61 74 20 74 77 6f  re such that two
2f3c0 20 6f 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73   or more threads
2f3d0 20 61 6c 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f   all trying to o
2f3e0 70 65 6e 20 64 61 74 61 62 61 73 65 73 20 61 74  pen databases at
2f3f0 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69  .  ** the same i
2f400 6e 73 74 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c  nstant might all
2f410 20 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e   reset the PRNG.
2f420 20 20 42 75 74 20 6d 75 6c 74 69 70 6c 65 20 72    But multiple r
2f430 65 73 65 74 73 0a 20 20 2a 2a 20 61 72 65 20 68  esets.  ** are h
2f440 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
2f450 69 66 28 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69  if( randomnessPi
2f460 64 21 3d 67 65 74 70 69 64 28 29 20 29 7b 0a 20  d!=getpid() ){. 
2f470 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64     randomnessPid
2f480 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20   = getpid();.   
2f490 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
2f4a0 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a 0a  ess(0,0);.  }...
2f4b0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
2f4c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2f4d0 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73   ){.    UnixUnus
2f4e0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20  edFd *pUnused;. 
2f4f0 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e     pUnused = fin
2f500 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d  dReusableFd(zNam
2f510 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  e, flags);.    i
2f520 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
2f530 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64      fd = pUnused
2f540 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->fd;.    }else{
2f550 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
2f560 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2f570 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
2f580 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55  );.      if( !pU
2f590 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
2f5a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2f5b0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
2f5c0 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73    }.    p->pUnus
2f5d0 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20  ed = pUnused;.. 
2f5e0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
2f5f0 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75  ilenames are dou
2f600 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61  ble-zero termina
2f610 74 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ted if they are 
2f620 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49 73 20  not.    ** URIs 
2f630 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
2f640 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
2f650 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
2f660 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73  ed into.    ** s
2f670 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
2f680 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61  eter(). */.    a
2f690 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
2f6a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
2f6b0 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e   || zName[strlen
2f6c0 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  (zName)+1]==0 );
2f6d0 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a  ..  }else if( !z
2f6e0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Name ){.    /* I
2f6f0 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c  f zName is NULL,
2f700 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
2f710 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61   is requesting a
2f720 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20   temp file. */. 
2f730 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65     assert(isDele
2f740 74 65 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b  te && !syncDir);
2f750 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65  .    rc = unixGe
2f760 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41  tTempname(MAX_PA
2f770 54 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d 70 6e 61  THNAME+2, zTmpna
2f780 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
2f790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f7a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f7b0 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
2f7c0 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20   zTmpname;..    
2f7d0 2f 2a 20 47 65 6e 65 72 61 74 65 64 20 74 65 6d  /* Generated tem
2f7e0 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 73  porary filenames
2f7f0 20 61 72 65 20 61 6c 77 61 79 73 20 64 6f 75 62   are always doub
2f800 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
2f810 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75 73  ed.    ** for us
2f820 65 20 62 79 20 73 71 6c 69 74 65 33 5f 75 72 69  e by sqlite3_uri
2f830 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f  _parameter(). */
2f840 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61  .    assert( zNa
2f850 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  me[strlen(zName)
2f860 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  +1]==0 );.  }.. 
2f870 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
2f880 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
2f890 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70  lags parameter p
2f8a0 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66  assed to POSIX f
2f8b0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65  unction.  ** ope
2f8c0 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20  n(). These must 
2f8d0 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76  be calculated ev
2f8e0 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20  en if open() is 
2f8f0 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20  not called, as. 
2f900 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20   ** they may be 
2f910 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
2f920 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
2f930 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68  e and used by th
2f940 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66  e .  ** 'conch f
2f950 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e  ile' locking fun
2f960 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e  ctions later on.
2f970 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61    */.  if( isRea
2f980 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61  donly )  openFla
2f990 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
2f9a0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
2f9b0 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
2f9c0 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
2f9d0 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65  sCreate )    ope
2f9e0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41  nFlags |= O_CREA
2f9f0 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  T;.  if( isExclu
2fa00 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  sive ) openFlags
2fa10 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f   |= (O_EXCL|O_NO
2fa20 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46  FOLLOW);.  openF
2fa30 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45  lags |= (O_LARGE
2fa40 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
2fa50 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
2fa60 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f     mode_t openMo
2fa70 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
2fa80 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
2fa90 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
2faa0 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74  ith */.    uid_t
2fab0 20 75 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   uid;           
2fac0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72           /* User
2fad0 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  id for the file 
2fae0 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20 67 69 64  */.    gid_t gid
2faf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fb00 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20       /* Groupid 
2fb10 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
2fb20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65      rc = findCre
2fb30 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d  ateFileMode(zNam
2fb40 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d  e, flags, &openM
2fb50 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29  ode, &uid, &gid)
2fb60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2fb70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fb80 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e   assert( !p->pUn
2fb90 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73  used );.      as
2fba0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
2fbb0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20  ITE_OPEN_WAL || 
2fbc0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2fbd0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
2fbe0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2fbf0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64  rc;.    }.    fd
2fc00 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
2fc10 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
2fc20 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
2fc30 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20  OSTRACE(("OPENX 
2fc40 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
2fc50 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65  , fd, zName, ope
2fc60 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66  nFlags));.    if
2fc70 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21  ( fd<0 && errno!
2fc80 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61  =EISDIR && isRea
2fc90 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
2fca0 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
2fcb0 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
2fcc0 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
2fcd0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
2fce0 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
2fcf0 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20   */.      flags 
2fd00 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
2fd10 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
2fd20 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
2fd30 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
2fd40 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  &= ~(O_RDWR|O_CR
2fd50 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67  EAT);.      flag
2fd60 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
2fd70 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2fd80 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2fd90 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73  RDONLY;.      is
2fda0 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
2fdb0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
2fdc0 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
2fdd0 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
2fde0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2fdf0 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  fd<0 ){.      rc
2fe00 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
2fe10 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2fe20 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e  BKPT, "open", zN
2fe30 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
2fe40 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
2fe50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2fe60 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
2fe70 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
2fe80 20 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e 67   and if creating
2fe90 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a   a new rollback.
2fea0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f      ** journal o
2feb0 72 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74 20  r WAL file, set 
2fec0 74 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  the ownership of
2fed0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
2fee0 57 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  WAL to be.    **
2fef0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2ff00 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
2ff10 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
2ff20 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
2ff30 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
2ff40 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2ff50 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 6f  RNAL) ){.      o
2ff60 73 46 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c  sFchown(fd, uid,
2ff70 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   gid);.    }.  }
2ff80 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30  .  assert( fd>=0
2ff90 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   );.  if( pOutFl
2ffa0 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74  ags ){.    *pOut
2ffb0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
2ffc0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e   }..  if( p->pUn
2ffd0 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70  used ){.    p->p
2ffe0 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
2fff0 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
30000 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
30010 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c    }..  if( isDel
30020 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  ete ){.#if OS_VX
30030 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20  WORKS.    zPath 
30040 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20  = zName;.#else. 
30050 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d     osUnlink(zNam
30060 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  e);.#endif.  }.#
30070 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
30080 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
30090 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70   else{.    p->op
300a0 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
300b0 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ags;.  }.#endif.
300c0 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70  .  noLock = eTyp
300d0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
300e0 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20  AIN_DB;..  .#if 
300f0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
30100 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
30110 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
30120 45 0a 20 20 69 66 28 20 66 73 74 61 74 66 73 28  E.  if( fstatfs(
30130 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  fd, &fsInfo) == 
30140 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  -1 ){.    ((unix
30150 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61  File*)pFile)->la
30160 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
30170 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
30180 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(p, fd, __LINE_
30190 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  _);.    return S
301a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
301b0 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  SS;.  }.  if (0 
301c0 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f  == strncmp("msdo
301d0 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  s", fsInfo.f_fst
301e0 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
301f0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
30200 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c  File)->fsFlags |
30210 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  = SQLITE_FSFLAGS
30220 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23  _IS_MSDOS;.  }.#
30230 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
30240 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  up appropriate c
30250 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66  trlFlags */.  if
30260 28 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20  ( isDelete )    
30270 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
30280 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
30290 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20  E_DELETE;.  if( 
302a0 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20  isReadonly )    
302b0 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
302c0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
302d0 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f  RDONLY;.  if( no
302e0 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20 20  Lock )          
302f0 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
30300 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  s |= UNIXFILE_NO
30310 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63  LOCK;.  if( sync
30320 44 69 72 20 29 20 20 20 20 20 20 20 20 20 20 20  Dir )           
30330 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
30340 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53  |= UNIXFILE_DIRS
30350 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  YNC;.  if( flags
30360 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
30370 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c  RI ) ctrlFlags |
30380 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a  = UNIXFILE_URI;.
30390 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
303a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
303b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  .#if SQLITE_PREF
303c0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
303d0 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d  .  isAutoProxy =
303e0 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   1;.#endif.  if(
303f0 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20   isAutoProxy && 
30400 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26  (zPath!=NULL) &&
30410 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56   (!noLock) && pV
30420 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20  fs->xOpen ){.   
30430 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20   char *envforce 
30440 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
30450 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
30460 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20  KING");.    int 
30470 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20  useProxy = 0;.. 
30480 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
30490 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
304a0 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20  ==1 means force 
304b0 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79  always use proxy
304c0 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a  , 0 means .    *
304d0 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78  * never use prox
304e0 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73  y, NULL means us
304f0 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d  e proxy for non-
30500 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79  local files only
30510 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e  .  */.    if( en
30520 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a  vforce!=NULL ){.
30530 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
30540 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e   atoi(envforce)>
30550 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
30560 20 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a      if( statfs(z
30570 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  Path, &fsInfo) =
30580 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
30590 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
305a0 65 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c  e close(fd) call
305b0 20 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e   is sub-optimal.
305c0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
305d0 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ned.        ** w
305e0 69 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61  ith fd is a data
305f0 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74  base file, and t
30600 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63  here are other c
30610 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a  onnections open.
30620 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68          ** on th
30630 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
30640 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69   currently holdi
30650 6e 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ng advisory lock
30660 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20  s on it,.       
30670 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c   ** then the cal
30680 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c  l to close() wil
30690 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c  l cancel those l
306a0 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63  ocks. In practic
306b0 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  e,.        ** we
306c0 27 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61  're assuming tha
306d0 74 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e  t statfs() doesn
306e0 27 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74  't fail very oft
306f0 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20  en. At least.   
30700 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c       ** not whil
30710 65 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  e other file des
30720 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
30730 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
30740 65 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ess on.        *
30750 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  * the same file 
30760 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f  are working.  */
30770 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74  .        p->last
30780 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
30790 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c         robust_cl
307a0 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(p, fd, __LIN
307b0 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  E__);.        rc
307c0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
307d0 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20 20  ACCESS;.        
307e0 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
307f0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
30800 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66    useProxy = !(f
30810 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e  sInfo.f_flags&MN
30820 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a  T_LOCAL);.    }.
30830 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79      if( useProxy
30840 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
30850 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
30860 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a  fs, fd, pFile, z
30870 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29  Path, ctrlFlags)
30880 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
30890 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
308a0 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
308b0 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
308c0 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
308d0 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20  e, ":auto:");.  
308e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
308f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30900 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78       /* Use unix
30910 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75  Close to clean u
30920 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  p the resources 
30930 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55  added in fillInU
30940 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20  nixFile .       
30950 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20     ** and clear 
30960 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72  all the structur
30970 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20  e's references. 
30980 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a   Specifically, .
30990 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69            ** pFi
309a0 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c  le->pMethods wil
309b0 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c  l be NULL so sql
309c0 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c  ite3OsClose will
309d0 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20   be a no-op .   
309e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
309f0 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46      unixClose(pF
30a00 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
30a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30a20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30a30 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
30a40 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ished;.    }.  }
30a50 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20  .#endif.  .  rc 
30a60 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
30a70 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65  (pVfs, fd, pFile
30a80 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61  , zPath, ctrlFla
30a90 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73  gs);..open_finis
30aa0 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  hed:.  if( rc!=S
30ab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30ac0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
30ad0 70 55 6e 75 73 65 64 29 3b 0a 20 20 20 20 70 2d  pUnused);.    p-
30ae0 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 20 20  >pUnused = 0;.  
30af0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
30b00 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ..static int uni
30b10 78 4f 70 65 6e 44 65 66 65 72 72 65 64 28 0a 20  xOpenDeferred(. 
30b20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
30b30 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fs,           /*
30b40 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69   The VFS for whi
30b50 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78  ch this is the x
30b60 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Open method */. 
30b70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
30b80 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  th,           /*
30b90 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c   Pathname of fil
30ba0 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  e to be opened *
30bb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
30bc0 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
30bd0 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
30be0 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69  criptor to be fi
30bf0 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  lled in */.  int
30c00 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
30c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
30c20 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74  ut flags to cont
30c30 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  rol the opening 
30c40 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
30c50 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
30c60 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67    /* Output flag
30c70 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  s returned to SQ
30c80 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a  Lite core */.){.
30c90 20 20 63 6f 6e 73 74 20 69 6e 74 20 6d 61 73 6b    const int mask
30ca0 31 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  1 = SQLITE_OPEN_
30cb0 4d 41 49 4e 5f 44 42 20 7c 20 53 51 4c 49 54 45  MAIN_DB | SQLITE
30cc0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
30cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ce0 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
30cf0 43 52 45 41 54 45 3b 0a 20 20 63 6f 6e 73 74 20  CREATE;.  const 
30d00 69 6e 74 20 6d 61 73 6b 32 20 3d 20 53 51 4c 49  int mask2 = SQLI
30d10 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
30d20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
30d30 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 20 20  DELETEONCLOSE.  
30d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d50 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  | SQLITE_OPEN_EX
30d60 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
30d70 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b  _OPEN_AUTOPROXY;
30d80 0a 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ..  int rc;     
30d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30da0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
30db0 64 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  de */.  unixFile
30dc0 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a   *p = (unixFile*
30dd0 29 70 46 69 6c 65 3b 20 2f 2a 20 46 69 6c 65 20  )pFile; /* File 
30de0 6f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  object to popula
30df0 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  te */.  const ch
30e00 61 72 20 2a 7a 55 72 69 20 3d 20 28 66 6c 61 67  ar *zUri = (flag
30e10 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49  s & UNIXFILE_URI
30e20 29 20 3f 20 7a 50 61 74 68 20 3a 20 30 3b 0a 0a  ) ? zPath : 0;..
30e30 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69    /* Zero the fi
30e40 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 6d  le object */.  m
30e50 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
30e60 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
30e70 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
30e80 5f 62 6f 6f 6c 65 61 6e 28 7a 55 72 69 2c 20 22  _boolean(zUri, "
30e90 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f  psow", SQLITE_PO
30ea0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
30eb0 45 29 20 29 7b 0a 20 20 20 20 70 2d 3e 63 74 72  E) ){.    p->ctr
30ec0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
30ed0 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 23 69 66  LE_PSOW;.  }.#if
30ee0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
30ef0 5f 53 49 5a 45 3e 30 0a 20 20 70 2d 3e 6d 6d 61  _SIZE>0.  p->mma
30f00 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74  pSizeMax = sqlit
30f10 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
30f20 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20  zMmap;.#endif.. 
30f30 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66   /* If all the f
30f40 6c 61 67 73 20 69 6e 20 6d 61 73 6b 31 20 61 72  lags in mask1 ar
30f50 65 20 73 65 74 2c 20 61 6e 64 20 61 6c 6c 20 74  e set, and all t
30f60 68 65 20 66 6c 61 67 73 20 69 6e 20 6d 61 73 6b  he flags in mask
30f70 32 20 61 72 65 0a 20 20 2a 2a 20 63 6c 65 61 72  2 are.  ** clear
30f80 2c 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  , the file does 
30f90 6e 6f 74 20 65 78 69 73 74 20 62 75 74 20 74 68  not exist but th
30fa0 65 20 64 69 72 65 63 74 6f 72 79 20 64 6f 65 73  e directory does
30fb0 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 77 72 69   and is.  ** wri
30fc0 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 69 73  table, then this
30fd0 20 69 73 20 61 20 64 65 66 65 72 72 65 64 20 6f   is a deferred o
30fe0 70 65 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 7a  pen.  */.  if( z
30ff0 50 61 74 68 20 26 26 20 28 66 6c 61 67 73 20 26  Path && (flags &
31000 20 28 6d 61 73 6b 31 20 7c 20 6d 61 73 6b 32 29   (mask1 | mask2)
31010 29 3d 3d 6d 61 73 6b 31 20 29 7b 0a 20 20 20 20  )==mask1 ){.    
31020 69 6e 74 20 70 6f 73 69 78 72 63 3b 0a 20 20 20  int posixrc;.   
31030 20 70 6f 73 69 78 72 63 20 3d 20 6f 73 41 63 63   posixrc = osAcc
31040 65 73 73 28 7a 50 61 74 68 2c 20 46 5f 4f 4b 29  ess(zPath, F_OK)
31050 3b 0a 20 20 20 20 69 66 28 20 70 6f 73 69 78 72  ;.    if( posixr
31060 63 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45  c && errno==ENOE
31070 4e 54 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  NT ){.      char
31080 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
31090 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 20 20 20  THNAME+1];.     
310a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
310b0 72 28 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28  r(i=(int)strlen(
310c0 7a 50 61 74 68 29 3b 20 69 3e 31 20 26 26 20 7a  zPath); i>1 && z
310d0 50 61 74 68 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d  Path[i]!='/'; i-
310e0 2d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  -);.      memcpy
310f0 28 7a 44 69 72 6e 61 6d 65 2c 20 7a 50 61 74 68  (zDirname, zPath
31100 2c 20 69 29 3b 0a 20 20 20 20 20 20 7a 44 69 72  , i);.      zDir
31110 6e 61 6d 65 5b 69 5d 20 3d 20 27 5c 30 27 3b 0a  name[i] = '\0';.
31120 20 20 20 20 20 20 70 6f 73 69 78 72 63 20 3d 20        posixrc = 
31130 6f 73 41 63 63 65 73 73 28 7a 44 69 72 6e 61 6d  osAccess(zDirnam
31140 65 2c 20 57 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  e, W_OK);.      
31150 69 66 28 20 70 6f 73 69 78 72 63 3d 3d 30 20 29  if( posixrc==0 )
31160 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4d 65  {.        p->pMe
31170 74 68 6f 64 20 3d 20 28 2a 2a 28 66 69 6e 64 65  thod = (**(finde
31180 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41  r_type*)pVfs->pA
31190 70 70 44 61 74 61 29 28 30 2c 20 30 29 3b 0a 20  ppData)(0, 0);. 
311a0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4d         if( p->pM
311b0 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 3d 3d 75 6e  ethod->xLock==un
311c0 69 78 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  ixLock ){.      
311d0 20 20 20 20 70 2d 3e 70 56 66 73 20 3d 20 70 56      p->pVfs = pV
311e0 66 73 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  fs;.          p-
311f0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  >h = -1;.       
31200 20 20 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20     p->ctrlFlags 
31210 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 46 45  |= UNIXFILE_DEFE
31220 52 52 45 44 3b 0a 20 20 20 20 20 20 20 20 20 20  RRED;.          
31230 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66  p->openFlags = f
31240 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
31250 70 2d 3e 7a 50 61 74 68 20 3d 20 7a 50 61 74 68  p->zPath = zPath
31260 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31270 70 4f 75 74 46 6c 61 67 73 20 29 20 2a 70 4f 75  pOutFlags ) *pOu
31280 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
31290 20 20 20 20 20 20 20 20 20 20 4f 70 65 6e 43 6f            OpenCo
312a0 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 20  unter(+1);.     
312b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
312c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
312d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
312e0 20 7d 0a 0a 20 20 72 63 20 3d 20 75 6e 69 78 4f   }..  rc = unixO
312f0 70 65 6e 28 70 56 66 73 2c 20 7a 50 61 74 68 2c  pen(pVfs, zPath,
31300 20 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 70   pFile, flags, p
31310 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 4f 70 65  OutFlags);.  Ope
31320 6e 43 6f 75 6e 74 65 72 28 20 72 63 3d 3d 53 51  nCounter( rc==SQ
31330 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
31340 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
31350 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
31360 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
31370 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
31380 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
31390 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
313a0 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
313b0 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
313c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
313d0 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
313e0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
313f0 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61      /* VFS conta
31400 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68  ining this as th
31410 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64  e xDelete method
31420 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
31430 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
31440 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
31450 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
31460 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20  .  int dirSync  
31470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31480 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  If true, fsync()
31490 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
314a0 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a   deleting file *
314b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
314c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
314d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
314e0 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
314f0 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
31500 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
31510 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55  LETE);.  if( osU
31520 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d  nlink(zPath)==(-
31530 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72  1) ){.    if( er
31540 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20  rno==ENOENT ){. 
31550 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31560 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
31570 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ENT;.    }else{.
31580 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
31590 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
315a0 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e  OERR_DELETE, "un
315b0 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20  link", zPath);. 
315c0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
315d0 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  rc;.  }.#ifndef 
315e0 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
315f0 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69  IRSYNC.  if( (di
31600 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b  rSync & 1)!=0 ){
31610 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20  .    int fd;.   
31620 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
31630 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64  ctory(zPath, &fd
31640 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
31650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20  QLITE_OK ){.#if 
31660 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20  OS_VXWORKS.     
31670 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d   if( fsync(fd)==
31680 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20  -1 ).#else.     
31690 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29   if( fsync(fd) )
316a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
316b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
316c0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
316d0 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
316e0 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68  , "fsync", zPath
316f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
31700 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c   robust_close(0,
31710 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
31720 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
31730 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
31740 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  N ){.      rc = 
31750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
31760 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
31770 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
31780 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74  * Test the exist
31790 65 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73  ence of or acces
317a0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  s permissions of
317b0 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65   file zPath. The
317c0 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d  .** test perform
317d0 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
317e0 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73  e value of flags
317f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
31800 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
31810 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
31820 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a  e file exists.**
31830 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
31840 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65  SS_READWRITE: Re
31850 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
31860 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77  le is read and w
31870 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  ritable..**     
31880 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
31890 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31  ADONLY: Return 1
318a0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
318b0 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  readable..**.** 
318c0 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
318d0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
318e0 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20  t unixAccess(.  
318f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
31900 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56  Used,   /* The V
31910 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
31920 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f  is xAccess metho
31930 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
31940 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f  r *zPath,      /
31950 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69  * Path of the fi
31960 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f  le to examine */
31970 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
31980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
31990 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f  at do we want to
319a0 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65   learn about the
319b0 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a   zPath file? */.
319c0 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
319d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
319e0 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61  te result boolea
319f0 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  n here */.){.  i
31a00 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  nt amode = 0;.  
31a10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31a20 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
31a30 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
31a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
31a50 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73  R_ACCESS; );.  s
31a60 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
31a70 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
31a80 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
31a90 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f       amode = F_O
31aa0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
31ab0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
31ac0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
31ad0 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
31ae0 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20  W_OK|R_OK;.     
31af0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
31b00 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
31b10 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  EAD:.      amode
31b20 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = R_OK;.      b
31b30 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
31b40 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
31b50 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
31b60 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
31b70 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f  .  *pResOut = (o
31b80 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61  sAccess(zPath, a
31b90 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28  mode)==0);.  if(
31ba0 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
31bb0 43 43 45 53 53 5f 45 58 49 53 54 53 20 26 26 20  CCESS_EXISTS && 
31bc0 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20  *pResOut ){.    
31bd0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
31be0 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  .    if( 0==osSt
31bf0 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20  at(zPath, &buf) 
31c00 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  && buf.st_size==
31c10 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 ){.      *pRes
31c20 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Out = 0;.    }. 
31c30 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
31c40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
31c50 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
31c60 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
31c70 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
31c80 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  The relative pat
31c90 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61  h.** is stored a
31ca0 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
31cb0 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65  ed string in the
31cc0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
31cd0 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20  to by.** zPath. 
31ce0 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e  .**.** zOut poin
31cf0 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  ts to a buffer o
31d00 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74  f at least sqlit
31d10 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
31d20 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20  e bytes .** (in 
31d30 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50  this case, MAX_P
31d40 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20  ATHNAME bytes). 
31d50 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73  The full-path is
31d60 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74   written to.** t
31d70 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72  his buffer befor
31d80 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
31d90 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
31da0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
31db0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
31dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
31dd0 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
31de0 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
31df0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
31e00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
31e10 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
31e20 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
31e30 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20  t nOut,         
31e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
31e50 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
31e60 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
31e70 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20  .  char *zOut   
31e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e90 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
31ea0 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74  r */.){..  /* It
31eb0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
31ec0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
31ed0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
31ee0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
31ef0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
31f00 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
31f10 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
31f20 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
31f30 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
31f40 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
31f50 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
31f60 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
31f70 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
31f80 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
31f90 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
31fa0 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
31fb0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
31fc0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
31fd0 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73  E_ERROR );..  as
31fe0 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61  sert( pVfs->mxPa
31ff0 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48  thname==MAX_PATH
32000 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44  NAME );.  UNUSED
32010 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
32020 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31  ;..  zOut[nOut-1
32030 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20  ] = '\0';.  if( 
32040 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b  zPath[0]=='/' ){
32050 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
32060 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74  rintf(nOut, zOut
32070 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a  , "%s", zPath);.
32080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
32090 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 6f   nCwd;.    if( o
320a0 73 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f  sGetcwd(zOut, nO
320b0 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ut-1)==0 ){.    
320c0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
320d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
320e0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74  TOPEN_BKPT, "get
320f0 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  cwd", zPath);.  
32100 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28    }.    nCwd = (
32110 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29  int)strlen(zOut)
32120 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
32130 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64  printf(nOut-nCwd
32140 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22  , &zOut[nCwd], "
32150 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  /%s", zPath);.  
32160 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
32170 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  E_OK;.}...#ifnde
32180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
32190 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
321a0 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
321b0 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
321c0 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
321d0 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
321e0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
321f0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
32200 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
32210 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
32220 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63  /.#include <dlfc
32230 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  n.h>.static void
32240 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c   *unixDlOpen(sql
32250 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
32260 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
32270 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55  Filename){.  UNU
32280 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
32290 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
322a0 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   dlopen(zFilenam
322b0 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54  e, RTLD_NOW | RT
322c0 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f  LD_GLOBAL);.}../
322d0 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c  *.** SQLite call
322e0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
322f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
32300 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  r a call to unix
32310 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e  DlSym() or.** un
32320 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73  ixDlOpen() fails
32330 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c   (returns a null
32340 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20   pointer). If a 
32350 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72  more detailed er
32360 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
32370 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20  s available, it 
32380 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42  is written to zB
32390 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72  ufOut. If no err
323a0 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73  or message.** is
323b0 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66   available, zBuf
323c0 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  Out is left unmo
323d0 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74  dified and SQLit
323e0 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74  e uses a default
323f0 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
32400 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
32410 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71  d unixDlError(sq
32420 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
32430 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
32440 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
32450 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
32460 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
32470 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32480 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
32490 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72  );.  zErr = dler
324a0 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72  ror();.  if( zEr
324b0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
324c0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
324d0 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a  zBufOut, "%s", z
324e0 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  Err);.  }.  unix
324f0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
32500 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e  static void (*un
32510 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  ixDlSym(sqlite3_
32520 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
32530 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  id *p, const cha
32540 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a  r*zSym))(void){.
32550 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77    /* .  ** GCC w
32560 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
32570 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43  rors says that C
32580 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  90 does not allo
32590 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a  w a void* to be.
325a0 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61    ** cast into a
325b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
325c0 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74  nction.  And yet
325d0 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73   the library dls
325e0 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a  ym() routine.  *
325f0 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64  * returns a void
32600 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c  * which is reall
32610 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
32620 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68   function.  So h
32630 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73  ow do we.  ** us
32640 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d  e dlsym() with -
32650 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f  pedantic-errors?
32660 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61  .  **.  ** Varia
32670 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64  ble x below is d
32680 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  efined to be a p
32690 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
326a0 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a  tion taking.  **
326b0 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64   parameters void
326c0 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72  * and const char
326d0 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  * and returning 
326e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
326f0 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65  unction..  ** We
32700 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79   initialize x by
32710 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
32720 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
32730 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lsym() function.
32740 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69  .  ** (That assi
32750 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20  gnment requires 
32760 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77  a cast.)  Then w
32770 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74  e call the funct
32780 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20  ion that.  ** x 
32790 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a  points to.  .  *
327a0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b  *.  ** This work
327b0 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b  -around is unlik
327c0 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72  ely to work corr
327d0 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73  ectly on any sys
327e0 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79  tem where.  ** y
327f0 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74  ou really cannot
32800 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e   cast a function
32810 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f   pointer into vo
32820 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20  id*.  But then, 
32830 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  on the.  ** othe
32840 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20  r hand, dlsym() 
32850 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  will not work on
32860 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65   such a system e
32870 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76  ither, so we hav
32880 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c  e.  ** not reall
32890 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e  y lost anything.
328a0 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28  .  */.  void (*(
328b0 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  *x)(void*,const 
328c0 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20  char*))(void);. 
328d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
328e0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20  R(NotUsed);.  x 
328f0 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69  = (void(*(*)(voi
32900 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
32910 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20  (void))dlsym;.  
32920 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a  return (*x)(p, z
32930 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Sym);.}.static v
32940 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28  oid unixDlClose(
32950 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
32960 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e  Used, void *pHan
32970 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
32980 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32990 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61  );.  dlclose(pHa
329a0 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  ndle);.}.#else /
329b0 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
329c0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
329d0 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
329e0 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f   #define unixDlO
329f0 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
32a00 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20   unixDlError 0. 
32a10 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53   #define unixDlS
32a20 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
32a30 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23   unixDlClose 0.#
32a40 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
32a50 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
32a60 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20   random data to 
32a70 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
32a80 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer zBuf..*/.sta
32a90 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64  tic int unixRand
32aa0 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
32ab0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
32ac0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
32ad0 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f){.  UNUSED_PAR
32ae0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
32af0 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f  .  assert((size_
32b00 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28  t)nBuf>=(sizeof(
32b10 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69  time_t)+sizeof(i
32b20 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  nt)));..  /* We 
32b30 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  have to initiali
32b40 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65  ze zBuf to preve
32b50 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  nt valgrind from
32b60 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20   reporting.  ** 
32b70 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70  errors.  The rep
32b80 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76  orts issued by v
32b90 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f  algrind are inco
32ba0 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64  rrect - we would
32bb0 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61  .  ** prefer tha
32bc0 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  t the randomness
32bd0 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79   be increased by
32be0 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74   making use of t
32bf0 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61  he.  ** uninitia
32c00 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a  lized space in z
32c10 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69  Buf - but valgri
32c20 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74  nd errors tend t
32c30 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d  o worry.  ** som
32c40 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72  e users.  Rather
32c50 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20   than argue, it 
32c60 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73  seems easier jus
32c70 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  t to initialize.
32c80 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61    ** the whole a
32c90 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65  rray and silence
32ca0 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20   valgrind, even 
32cb0 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65  if that means le
32cc0 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20  ss randomness.  
32cd0 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d  ** in the random
32ce0 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   seed..  **.  **
32cf0 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69   When testing, i
32d00 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66  nitializing zBuf
32d10 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c  [] to zero is al
32d20 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d  l we do.  That m
32d30 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  eans.  ** that w
32d40 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
32d50 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d   same random num
32d60 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ber sequence.  T
32d70 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20  his makes the.  
32d80 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61  ** tests repeata
32d90 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  ble..  */.  mems
32da0 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
32db0 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50  );.  randomnessP
32dc0 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 20 20  id = getpid();  
32dd0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
32de0 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20  LITE_TEST).  {. 
32df0 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a     int fd, got;.
32e00 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
32e10 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
32e20 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30  om", O_RDONLY, 0
32e30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
32e40 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20  ){.      time_t 
32e50 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74  t;.      time(&t
32e60 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
32e70 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66  zBuf, &t, sizeof
32e80 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (t));.      memc
32e90 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
32ea0 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73  t)], &randomness
32eb0 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64  Pid, sizeof(rand
32ec0 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20 20  omnessPid));.   
32ed0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
32ee0 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64  f(t)+sizeof(rand
32ef0 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69 7a  omnessPid)<=(siz
32f00 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  e_t)nBuf );.    
32f10 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28    nBuf = sizeof(
32f20 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64  t) + sizeof(rand
32f30 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20 20  omnessPid);.    
32f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b  }else{.      do{
32f50 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64   got = osRead(fd
32f60 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d  , zBuf, nBuf); }
32f70 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
32f80 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
32f90 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
32fa0 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
32fb0 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  __);.    }.  }.#
32fc0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
32fd0 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  Buf;.}.../*.** S
32fe0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
32ff0 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
33000 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
33010 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
33020 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
33030 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
33040 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  oseconds we want
33050 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68   to sleep..** Th
33060 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
33070 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
33080 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20  microseconds of 
33090 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a  sleep actually.*
330a0 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
330b0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
330c0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
330d0 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68  , a number which
330e0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65  .** might be gre
330f0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
33100 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  al to the argume
33110 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73  nt, but not less
33120 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67  .** than the arg
33130 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
33140 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73   int unixSleep(s
33150 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
33160 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  sed, int microse
33170 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56  conds){.#if OS_V
33180 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
33190 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20  timespec sp;..  
331a0 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72  sp.tv_sec = micr
331b0 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30  oseconds / 10000
331c0 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63  00;.  sp.tv_nsec
331d0 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
331e0 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30   % 1000000) * 10
331f0 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28  00;.  nanosleep(
33200 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e  &sp, NULL);.  UN
33210 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
33220 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
33230 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
33240 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
33250 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
33260 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65  VE_USLEEP.  usle
33270 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  ep(microseconds)
33280 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
33290 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
332a0 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
332b0 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  onds;.#else.  in
332c0 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63  t seconds = (mic
332d0 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39  roseconds+999999
332e0 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65  )/1000000;.  sle
332f0 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  ep(seconds);.  U
33300 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
33310 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
33320 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
33330 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  00;.#endif.}../*
33340 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
33350 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
33360 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
33370 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
33380 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
33390 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
333a0 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
333b0 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
333c0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
333d0 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
333e0 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
333f0 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
33400 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
33410 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
33420 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
33430 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
33440 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
33450 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
33460 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
33470 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
33480 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
33490 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
334a0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
334b0 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
334c0 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
334d0 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
334e0 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
334f0 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
33500 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
33510 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
33520 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
33530 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
33540 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
33550 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
33560 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
33570 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
33580 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
33590 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
335a0 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
335b0 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
335c0 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
335d0 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
335e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
335f0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
33600 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  te .** cannot be
33610 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
33620 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
33630 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
33640 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
33650 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
33660 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63  piNow){.  static
33670 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
33680 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
33690 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
336a0 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
336b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
336c0 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69  ITE_OK;.#if defi
336d0 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
336e0 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
336f0 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  e(&t);.  *piNow 
33700 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
33710 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78  4)t)*1000 + unix
33720 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f  Epoch;.#elif OS_
33730 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
33740 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
33750 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
33760 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
33770 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77  &sNow);.  *piNow
33780 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
33790 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
337a0 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
337b0 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30   sNow.tv_nsec/10
337c0 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73  00000;.#else.  s
337d0 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
337e0 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69 6d  ow;.  if( gettim
337f0 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
33800 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ==0 ){.    *piNo
33810 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
33820 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
33830 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
33840 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31  + sNow.tv_usec/1
33850 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  000;.  }else{.  
33860 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
33870 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ROR;.  }.#endif.
33880 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
33890 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
338a0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
338b0 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
338c0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
338d0 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
338e0 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
338f0 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
33900 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
33910 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
33920 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33930 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
33940 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
33950 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
33960 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
33970 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
33980 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
33990 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
339a0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
339b0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
339c0 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
339d0 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
339e0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
339f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33a00 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28  unixCurrentTime(
33a10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
33a20 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72  Used, double *pr
33a30 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Now){.  sqlite3_
33a40 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69  int64 i = 0;.  i
33a50 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f  nt rc;.  UNUSED_
33a60 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
33a70 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43  d);.  rc = unixC
33a80 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
33a90 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77  0, &i);.  *prNow
33aa0 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
33ab0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33ac0 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20  ./*.** We added 
33ad0 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f  the xGetLastErro
33ae0 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20  r() method with 
33af0 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66  the intention of
33b00 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65   providing.** be
33b10 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65  tter low-level e
33b20 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68  rror messages wh
33b30 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73  en operating-sys
33b40 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d  tem problems com
33b50 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53  e up.** during S
33b60 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e  QLite operation.
33b70 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f    But so far, no
33b80 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20 62  ne of that has b
33b90 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  een implemented.
33ba0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20  ** in the core. 
33bb0 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   So this routine
33bc0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
33bd0 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69  .  For now, it i
33be0 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c  s merely.** a pl
33bf0 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73  ace-holder..*/.s
33c00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
33c10 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
33c20 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
33c30 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63   int NotUsed2, c
33c40 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a  har *NotUsed3){.
33c50 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
33c60 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55  ER(NotUsed);.  U
33c70 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
33c80 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55  NotUsed2);.  UNU
33c90 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
33ca0 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72  tUsed3);.  retur
33cb0 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a  n 0;.}.../*.****
33cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33cd0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69  **** End of sqli
33ce0 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
33cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
33d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
33d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
33db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33dc0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72  ******* Begin Pr
33dd0 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  oxy Locking ****
33de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
33e00 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
33e10 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b   is a "uber-lock
33e20 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  ing-method" in t
33e30 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75  his sense:  It u
33e40 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ses the.** other
33e50 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
33e60 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f   on secondary lo
33e70 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79  ck files.  Proxy
33e80 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a   locking is a.**
33e90 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72   meta-layer over
33ea0 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d   top of the prim
33eb0 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  itive locking im
33ec0 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e  plemented above.
33ed0 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65    For.** this re
33ee0 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
33ef0 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
33f00 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  ts of proxy lock
33f10 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a  ing is deferred.
33f20 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e  ** until late in
33f30 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29   the file (here)
33f40 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
33f50 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68  e other I/O meth
33f60 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  ods have.** been
33f70 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68   defined - so th
33f80 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  at the primitive
33f90 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
33fa0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   are available.*
33fb0 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f  * as services to
33fc0 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69   help with the i
33fd0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
33fe0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
33ff0 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  **.****.**.** Th
34000 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
34010 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c  g schemes in SQL
34020 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e  ite use byte-ran
34030 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a  ge locks on the.
34040 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
34050 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73   to coordinate s
34060 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  afe, concurrent 
34070 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
34080 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e  le readers.** an
34090 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a  d writers [http:
340a0 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63  //sqlite.org/loc
340b0 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54  kingv3.html].  T
340c0 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63  he five file loc
340d0 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28  king.** states (
340e0 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e  UNLOCKED, PENDIN
340f0 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  G, SHARED, RESER
34100 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20  VED, EXCLUSIVE) 
34110 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  are implemented.
34120 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64  ** as POSIX read
34130 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f   & write locks o
34140 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66  ver fixed set of
34150 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20   locations (via 
34160 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46  fsctl),.** on AF
34170 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65  P and SMB only e
34180 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61  xclusive byte-ra
34190 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76  nge locks are av
341a0 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74  ailable via fsct
341b0 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28  l.** with _IOWR(
341c0 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
341d0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
341e0 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73  ) to track the s
341f0 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a  ame 5 states..**
34200 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46   To simulate a F
34210 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68  _RDLCK on the sh
34220 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41  ared range, on A
34230 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65  FP a randomly se
34240 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73  lected.** addres
34250 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  s in the shared 
34260 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
34270 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  or a SHARED lock
34280 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20  , the entire.** 
34290 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
342a0 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43  taken for an EXC
342b0 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a  LUSIVE lock):.**
342c0 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47  .**      PENDING
342d0 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34  _BYTE        0x4
342e0 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20  0000000.**      
342f0 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20  RESERVED_BYTE   
34300 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a      0x40000001.*
34310 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41  *      SHARED_RA
34320 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30  NGE        0x400
34330 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30  00002 -> 0x40000
34340 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  200.**.** This w
34350 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65  orks well on the
34360 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
34370 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20  em, but shows a 
34380 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73  nearly 100x.** s
34390 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20  lowdown in read 
343a0 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41  performance on A
343b0 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41  FP because the A
343c0 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c  FP client disabl
343d0 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63  es.** the read c
343e0 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72  ache when byte-r
343f0 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70  ange locks are p
34400 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e  resent.  Enablin
34410 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61  g the read.** ca
34420 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61  che exposes a ca
34430 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72  che coherency pr
34440 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72  oblem that is pr
34450 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20  esent on all OS 
34460 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e  X.** supported n
34470 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74  etwork file syst
34480 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46  ems.  NFS and AF
34490 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74  P both observe t
344a0 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f  he.** close-to-o
344b0 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f  pen semantics fo
344c0 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65  r ensuring cache
344d0 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68   coherency.** [h
344e0 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65  ttp://nfs.source
344f0 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61  forge.net/#faq_a
34500 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e  8], which does n
34510 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a  ot effectively.*
34520 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65  * address the re
34530 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63  quirements for c
34540 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  oncurrent databa
34550 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  se access by mul
34560 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73  tiple.** readers
34570 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20   and writers.** 
34580 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62  [http://www.nabb
34590 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e  le.com/SQLite-on
345a0 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72  -NFS-cache-coher
345b0 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e  ency-td15655701.
345c0 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  html]..**.** To 
345d0 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66  address the perf
345e0 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68  ormance and cach
345f0 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75  e coherency issu
34600 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c  es, proxy file l
34610 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  ocking.** change
34620 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61  s the way databa
34630 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e  se access is con
34640 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74  trolled by limit
34650 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a  ing access to a.
34660 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61  ** single host a
34670 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76  t a time and mov
34680 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f  ing file locks o
34690 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ff of the databa
346a0 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f  se file.** and o
346b0 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65  nto a proxy file
346c0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
346d0 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a  le system.  .**.
346e0 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78  **.** Using prox
346f0 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  y locks.** -----
34700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
34710 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20  ** C APIs.**.** 
34720 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
34730 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
34740 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
34750 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
34760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34770 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68       <proxy_path
34780 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a  > | ":auto:");.*
34790 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
347a0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
347b0 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  me, SQLITE_GET_L
347c0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c  OCKPROXYFILE, &<
347d0 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a  proxy_path>);.**
347e0 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d  .**.** SQL pragm
347f0 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41  as.**.**  PRAGMA
34800 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
34810 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f  _proxy_file=<pro
34820 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f  xy_path> | :auto
34830 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  :.**  PRAGMA [da
34840 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
34850 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70  xy_file.**.** Sp
34860 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a  ecifying ":auto:
34870 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  " means that if 
34880 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68  there is a conch
34890 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74   file with a mat
348a0 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44  ching.** host ID
348b0 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78   in it, the prox
348c0 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f  y path in the co
348d0 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nch file will be
348e0 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65   used, otherwise
348f0 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68  .** a proxy path
34900 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73   based on the us
34910 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a  er's temp dir.**
34920 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43   (via confstr(_C
34930 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
34940 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c  MP_DIR,...)) wil
34950 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68  l be used and th
34960 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78  e.** actual prox
34970 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67  y file name is g
34980 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
34990 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20  e name and path 
349a0 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
349b0 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78  se file.  For ex
349c0 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
349d0 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20     For database 
349e0 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f  path "/Users/me/
349f0 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20  foo.db" .**     
34a00 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20    The lock path 
34a10 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72  will be "<tmpdir
34a20 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f  >/sqliteplocks/_
34a30 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a  Users_me_foo.db:
34a40 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e  auto:").**.** On
34a50 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20  ce a lock proxy 
34a60 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  is configured fo
34a70 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
34a80 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20  nection, it can 
34a90 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65  not.** be remove
34aa0 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61  d, however it ma
34ab0 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f  y be switched to
34ac0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f   a different pro
34ad0 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74  xy path via.** t
34ae0 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61  he above APIs (a
34af0 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63  ssuming the conc
34b00 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65  h file is not be
34b10 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74  ing held by anot
34b20 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  her.** connectio
34b30 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a  n or process). .
34b40 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f  **.**.** How pro
34b50 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  xy locking works
34b60 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
34b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
34b80 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  * Proxy file loc
34b90 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d  king relies prim
34ba0 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77  arily on two new
34bb0 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65   supporting file
34bc0 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63  s: .**.**   *  c
34bd0 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d  onch file to lim
34be0 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  it access to the
34bf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
34c00 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a  o a single host.
34c10 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d  **      at a tim
34c20 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f  e.**.**   *  pro
34c30 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61  xy file to act a
34c40 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68  s a proxy for th
34c50 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  e advisory locks
34c60 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20   normally.**    
34c70 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64    taken on the d
34c80 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68  atabase.**.** Th
34c90 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74  e conch file - t
34ca0 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69  o use a proxy fi
34cb0 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20  le, sqlite must 
34cc0 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20  first "hold the 
34cd0 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b  conch".** by tak
34ce0 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74  ing an sqlite-st
34cf0 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  yle shared lock 
34d00 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  on the conch fil
34d10 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a  e, reading the.*
34d20 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63  * contents and c
34d30 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73  omparing the hos
34d40 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20  t's unique host 
34d50 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61  ID (see below) a
34d60 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79  nd lock.** proxy
34d70 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68   path against th
34d80 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
34d90 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54  in the conch.  T
34da0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
34db0 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68  .** stored in th
34dc0 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
34dd0 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
34de0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
34df0 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61  le name.** is pa
34e00 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68  tterned after th
34e10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
34e20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62  name as ".<datab
34e30 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e  asename>-conch".
34e40 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68  .** If the conch
34e50 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
34e60 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f  xist, or it's co
34e70 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  ntents do not ma
34e80 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20  tch the.** host 
34e90 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20  ID and/or proxy 
34ea0 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c  path, then the l
34eb0 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64  ock is escalated
34ec0 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
34ed0 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65  .** lock and the
34ee0 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
34ef0 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20  ents is updated 
34f00 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44  with the host ID
34f10 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61   and proxy.** pa
34f20 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  th and the lock 
34f30 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  is downgraded to
34f40 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
34f50 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f  gain.  If the co
34f60 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62  nch.** is held b
34f70 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  y another proces
34f80 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64  s (with a shared
34f90 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c   lock), the excl
34fa0 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69  usive lock.** wi
34fb0 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49  ll fail and SQLI
34fc0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
34fd0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ned..**.** The p
34fe0 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69  roxy file - a si
34ff0 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75  ngle-byte file u
35000 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69  sed for all advi
35010 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a  sory file locks.
35020 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65  ** normally take
35030 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
35040 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61  e file.   This a
35050 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73  llows for safe s
35060 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65  haring.** of the
35070 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
35080 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  or multiple read
35090 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20  ers and writers 
350a0 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68  on the same.** h
350b0 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65  ost (the conch e
350c0 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79  nsures that they
350d0 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d   all use the sam
350e0 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
350f0 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73  e)..**.** Reques
35100 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72  ting the lock pr
35110 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d  oxy does not imm
35120 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68  ediately take th
35130 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a  e conch, it is.*
35140 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65  * only taken whe
35150 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  n the first requ
35160 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61  est to lock data
35170 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64  base file is mad
35180 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74  e.  .** This mat
35190 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69  ches the semanti
351a0 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74  cs of the tradit
351b0 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65  ional locking be
351c0 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a  havior, where.**
351d0 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65   opening a conne
351e0 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62  ction to a datab
351f0 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  ase file does no
35200 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e  t take a lock on
35210 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72   it..** The shar
35220 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f  ed lock and an o
35230 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
35240 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e  tor are maintain
35250 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65  ed until .** the
35260 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
35270 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
35280 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  losed. .**.** Th
35290 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64  e proxy file and
352a0 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
352b0 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64  re never deleted
352c0 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65   so they only ne
352d0 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61  ed.** to be crea
352e0 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69  ted the first ti
352f0 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64  me they are used
35300 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ..**.** Configur
35310 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a  ation options.**
35320 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
35330 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51  ------.**.**  SQ
35340 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
35350 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20  Y_LOCKING.**.** 
35360 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66        Database f
35370 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e  iles accessed on
35380 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20   non-local file 
35390 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20  systems are.**  
353a0 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c       automatical
353b0 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ly configured fo
353c0 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c  r proxy locking,
353d0 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a   lock files are.
353e0 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61  **       named a
353f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69  utomatically usi
35400 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69  ng the same logi
35410 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52  c as.**       PR
35420 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f  AGMA lock_proxy_
35430 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a  file=":auto:".**
35440 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f      .**  SQLITE_
35450 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a  PROXY_DEBUG.**.*
35460 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20  *       Enables 
35470 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65  the logging of e
35480 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75  rror messages du
35490 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c  ring host id fil
354a0 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69  e.**       retri
354b0 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f  eval and creatio
354c0 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f  n.**.**  LOCKPRO
354d0 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20  XYDIR.**.**     
354e0 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20    Overrides the 
354f0 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72  default director
35500 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20  y used for lock 
35510 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74  proxy files that
35520 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61  .**       are na
35530 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
35540 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f  y via the ":auto
35550 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a  :" setting.**.**
35560 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
35570 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
35580 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20  SIONS.**.**     
35590 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f    Permissions to
355a0 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69   use when creati
355b0 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66  ng a directory f
355c0 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a  or storing the.*
355d0 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f  *       lock pro
355e0 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75  xy files, only u
355f0 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f  sed when LOCKPRO
35600 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74  XYDIR is not set
35610 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a  ..**    .**    .
35620 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20  ** As mentioned 
35630 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70  above, when comp
35640 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
35650 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
35660 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e  CKING,.** settin
35670 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  g the environmen
35680 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54  t variable SQLIT
35690 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
356a0 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a  CKING to 1 will.
356b0 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c  ** force proxy l
356c0 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65  ocking to be use
356d0 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  d for every data
356e0 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64  base file opened
356f0 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20  , and 0.** will 
35700 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20  force automatic 
35710 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
35720 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72   be disabled for
35730 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
35740 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74   files (explicit
35750 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51  y calling the SQ
35760 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
35770 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72  XYFILE pragma or
35780 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f  .** sqlite_file_
35790 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e  control API is n
357a0 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53  ot affected by S
357b0 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
357c0 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a  Y_LOCKING)..*/..
357d0 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  /*.** Proxy lock
357e0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
357f0 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
35800 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
35810 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
35820 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
35830 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
35840 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   The proxyLockin
35850 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65  gContext has the
35860 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73   path and file s
35870 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
35880 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64  e remote .** and
35890 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c   local proxy fil
358a0 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65  es in it.*/.type
358b0 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79  def struct proxy
358c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70  LockingContext p
358d0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
358e0 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79  xt;.struct proxy
358f0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
35900 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
35910 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  chFile;         
35920 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69  /* Open conch fi
35930 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  le */.  char *co
35940 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20  nchFilePath;    
35950 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
35960 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
35970 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f  /.  unixFile *lo
35980 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20  ckProxy;        
35990 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c   /* Open proxy l
359a0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
359b0 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74  ar *lockProxyPat
359c0 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
359d0 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  me of the proxy 
359e0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
359f0 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
35a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
35a10 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
35a20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  file */.  int co
35a30 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20  nchHeld;        
35a40 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74         /* 1 if t
35a50 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64  he conch is held
35a60 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73  , -1 if lockless
35a70 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c   */.  void *oldL
35a80 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
35a90 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
35aa0 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f  ockingcontext to
35ab0 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73   restore on clos
35ac0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
35ad0 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
35ae0 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20  *pOldMethod;    
35af0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f   /* Original I/O
35b00 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f   methods for clo
35b10 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a  se */.};../* .**
35b20 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   The proxy lock 
35b30 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68  file path for th
35b40 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62  e database at db
35b50 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  Path is written 
35b60 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20  into lPath, .** 
35b70 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74  which must point
35b80 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61   to valid, writa
35b90 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65  ble memory large
35ba0 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61   enough for a ma
35bb0 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66  xLen length.** f
35bc0 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74  ile path. .*/.st
35bd0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
35be0 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  tLockPath(const 
35bf0 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
35c00 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f  ar *lPath, size_
35c10 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74  t maxLen){.  int
35c20 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65   len;.  int dbLe
35c30 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66  n;.  int i;..#if
35c40 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  def LOCKPROXYDIR
35c50 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
35c60 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58  (lPath, LOCKPROX
35c70 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  YDIR, maxLen);.#
35c80 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53  else.# ifdef _CS
35c90 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
35ca0 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66  P_DIR.  {.    if
35cb0 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ( !confstr(_CS_D
35cc0 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
35cd0 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c  DIR, lPath, maxL
35ce0 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  en) ){.      OST
35cf0 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41  RACE(("GETLOCKPA
35d00 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72  TH  failed %s er
35d10 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22  rno=%d pid=%d\n"
35d20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35d30 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67   lPath, errno, g
35d40 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20  etpid()));.     
35d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
35d60 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  OERR_LOCK;.    }
35d70 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
35d80 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74  at(lPath, "sqlit
35d90 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e  eplocks", maxLen
35da0 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73  );    .  }.# els
35db0 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  e.  len = strlcp
35dc0 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22  y(lPath, "/tmp/"
35dd0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64  , maxLen);.# end
35de0 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  if.#endif..  if(
35df0 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27   lPath[len-1]!='
35e00 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  /' ){.    len = 
35e10 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
35e20 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d  /", maxLen);.  }
35e30 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f  .  .  /* transfo
35e40 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74  rm the db path t
35e50 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65  o a unique cache
35e60 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e   name */.  dbLen
35e70 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
35e80 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69  bPath);.  for( i
35e90 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28  =0; i<dbLen && (
35ea0 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61  i+len+7)<(int)ma
35eb0 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xLen; i++){.    
35ec0 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b  char c = dbPath[
35ed0 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b  i];.    lPath[i+
35ee0 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f  len] = (c=='/')?
35ef0 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61  '_':c;.  }.  lPa
35f00 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a  th[i+len]='\0';.
35f10 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c    strlcat(lPath,
35f20 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65   ":auto:", maxLe
35f30 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  n);.  OSTRACE(("
35f40 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  GETLOCKPATH  pro
35f50 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
35f60 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68  pid=%d\n", lPath
35f70 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
35f80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35f90 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65  ;.}../* . ** Cre
35fa0 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69  ates the lock fi
35fb0 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69  le and any missi
35fc0 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69  ng directories i
35fd0 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73  n lockPath. */.s
35fe0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
35ff0 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f  reateLockPath(co
36000 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  nst char *lockPa
36010 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65  th){.  int i, le
36020 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41  n;.  char buf[MA
36030 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74  XPATHLEN];.  int
36040 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20   start = 0;.  . 
36050 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68   assert(lockPath
36060 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72  !=NULL);.  /* tr
36070 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20  y to create all 
36080 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
36090 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a   directories */.
360a0 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72    len = (int)str
360b0 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  len(lockPath);. 
360c0 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61   buf[0] = lockPa
360d0 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d  th[0];.  for( i=
360e0 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b  1; i<len; i++ ){
360f0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74  .    if( lockPat
36100 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28  h[i] == '/' && (
36110 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29  i - start > 0) )
36120 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20  {.      /* only 
36130 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69  mkdir if leaf di
36140 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20  r != "." or "/" 
36150 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20  or ".." */.     
36160 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c   if( i-start>2 |
36170 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26  | (i-start==1 &&
36180 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
36190 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  .' && buf[start]
361a0 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20   != '/') .      
361b0 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d     || (i-start==
361c0 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  2 && buf[start] 
361d0 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
361e0 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29  art+1] != '.') )
361f0 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d  {.        buf[i]
36200 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\0';.        i
36210 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20  f( osMkdir(buf, 
36220 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
36230 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
36240 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ONS) ){.        
36250 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
36260 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
36270 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20  rr!=EEXIST ) {. 
36280 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
36290 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
362a0 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61  ATH  FAILED crea
362b0 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20  ting %s, ".     
362c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
362d0 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b  "'%s' proxy lock
362e0 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
362f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
36300 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74           buf, st
36310 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63  rerror(err), loc
36320 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29  kPath, getpid())
36330 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
36340 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20  eturn err;.     
36350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
36360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
36370 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a  tart=i+1;.    }.
36380 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63      buf[i] = loc
36390 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20  kPath[i];.  }.  
363a0 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
363b0 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
363c0 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
363d0 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68  =%d\n", lockPath
363e0 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
363f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
36400 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
36410 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70  VFS file descrip
36420 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d  tor (stored in m
36430 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
36440 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
36450 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20  alloc) and open 
36460 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  the file named "
36470 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c  path" in the fil
36480 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
36490 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
364a0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f  s responsible no
364b0 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69  t only for closi
364c0 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ng the file desc
364d0 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c  riptor.** but al
364e0 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  so for freeing t
364f0 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  he memory associ
36500 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
36510 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
36520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
36530 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
36540 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
36550 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f   *path,        /
36560 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e  * path for the n
36570 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  ew unixFile */. 
36580 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70     unixFile **pp
36590 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75  File,       /* u
365a0 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20  nixFile created 
365b0 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  and returned by 
365c0 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ref */.    int i
365d0 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20  slockfile       
365e0 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65      /* if non ze
365f0 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20  ro missing dirs 
36600 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
36610 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20  */.) {.  int fd 
36620 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65  = -1;.  unixFile
36630 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
36640 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
36650 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
36660 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
36670 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
36680 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20  dummyVfs;.  int 
36690 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e  terrno = 0;.  Un
366a0 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
366b0 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f  sed = NULL;..  /
366c0 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74  * 1. first try t
366d0 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
366e0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69  e file.  ** 2. i
366f0 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e  f that fails, an
36700 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b  d this is a lock
36710 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68   file (not-conch
36720 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a  ), try creating.
36730 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20    ** the parent 
36740 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20  directories and 
36750 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a  then try again..
36760 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20    ** 3. if that 
36770 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70  fails, try to op
36780 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64  en the file read
36790 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72  -only.  ** other
367a0 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59  wise return BUSY
367b0 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20   (if lock file) 
367c0 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20  or CANTOPEN for 
367d0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20  the conch file. 
367e0 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20   */.  pUnused = 
367f0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70  findReusableFd(p
36800 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b  ath, openFlags);
36810 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29  .  if( pUnused )
36820 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73  {.    fd = pUnus
36830 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b  ed->fd;.  }else{
36840 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73  .    pUnused = s
36850 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
36860 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
36870 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65  .    if( !pUnuse
36880 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
36890 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
368a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
368b0 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d  fd<0 ){.    fd =
368c0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
368d0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
368e0 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
368f0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64  rrno;.    if( fd
36900 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  <0 && errno==ENO
36910 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c  ENT && islockfil
36920 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
36930 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
36940 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49  th(path) == SQLI
36950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36960 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
36970 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
36980 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  s, 0);.      }. 
36990 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
369a0 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46  d<0 ){.    openF
369b0 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
369c0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
369d0 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
369e0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74  Flags, 0);.    t
369f0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
36a00 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
36a10 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66  .    if( islockf
36a20 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ile ){.      ret
36a30 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
36a40 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
36a50 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20  h (terrno) {.   
36a60 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a     case EACCES:.
36a70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
36a80 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
36a90 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20    case EIO: .   
36aa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
36ab0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f  TE_IOERR_LOCK; /
36ac0 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  * even though it
36ad0 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f   is the conch */
36ae0 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
36af0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
36b00 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
36b10 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  KPT;.    }.  }. 
36b20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78   .  pNew = (unix
36b30 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  File *)sqlite3_m
36b40 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e  alloc(sizeof(*pN
36b50 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ew));.  if( pNew
36b60 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  ==NULL ){.    rc
36b70 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
36b80 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72  .    goto end_cr
36b90 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a  eate_proxy;.  }.
36ba0 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
36bb0 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
36bc0 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65  e));.  pNew->ope
36bd0 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
36be0 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  gs;.  memset(&du
36bf0 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f  mmyVfs, 0, sizeo
36c00 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20  f(dummyVfs));.  
36c10 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74  dummyVfs.pAppDat
36c20 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f  a = (void*)&auto
36c30 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20  lockIoFinder;.  
36c40 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d  dummyVfs.zName =
36c50 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75   "dummy";.  pUnu
36c60 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
36c70 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
36c80 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e   openFlags;.  pN
36c90 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55  ew->pUnused = pU
36ca0 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d  nused;.  .  rc =
36cb0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
36cc0 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28  &dummyVfs, fd, (
36cd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e  sqlite3_file*)pN
36ce0 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20 20  ew, path, 0);.  
36cf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36d00 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
36d10 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
36d20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
36d30 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
36d40 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73  oxy:    .  robus
36d50 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64  t_close(pNew, fd
36d60 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73  , __LINE__);.  s
36d70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
36d80 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
36d90 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65  e(pUnused);.  re
36da0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
36db0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
36dc0 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
36dd0 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
36de0 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
36df0 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
36e00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  /.int sqlite3_ho
36e10 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65  stid_num = 0;.#e
36e20 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52  ndif..#define PR
36e30 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20  OXY_HOSTIDLEN   
36e40 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   16  /* conch fi
36e50 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74  le host id lengt
36e60 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77  h */../* Not alw
36e70 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  ays defined in t
36e80 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69 74  he headers as it
36e90 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a   ought to be */.
36ea0 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f  extern int getho
36eb0 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69 64  stuuid(uuid_t id
36ec0 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  , const struct t
36ed0 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a  imespec *wait);.
36ee0 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74  ./* get the host
36ef0 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75   ID via gethostu
36f00 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d  uid(), pHostID m
36f10 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f  ust point to PRO
36f20 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a  XY_HOSTIDLEN .**
36f30 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62   bytes of writab
36f40 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  le memory..*/.st
36f50 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
36f60 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64  tHostID(unsigned
36f70 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20   char *pHostID, 
36f80 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20  int *pError){.  
36f90 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53  assert(PROXY_HOS
36fa0 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66  TIDLEN == sizeof
36fb0 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d  (uuid_t));.  mem
36fc0 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20  set(pHostID, 0, 
36fd0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
36fe0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
36ff0 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAX_OS_X_VERSION
37000 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a  _MIN_REQUIRED)\.
37010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
37020 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52  & __MAC_OS_X_VER
37030 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45  SION_MIN_REQUIRE
37040 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20 20 73  D<1050.  {.    s
37050 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
37060 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65  ct timespec time
37070 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a  out = {1, 0}; /*
37080 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a   1 sec timeout *
37090 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73  /.    if( gethos
370a0 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26  tuuid(pHostID, &
370b0 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20  timeout) ){.    
370c0 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
370d0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72  o;.      if( pEr
370e0 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ror ){.        *
370f0 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
37100 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
37110 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
37120 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
37130 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
37140 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e  TER(pError);.#en
37150 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
37160 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75  E_TEST.  /* simu
37170 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
37180 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
37190 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
371a0 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66  le paths */.  if
371b0 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
371c0 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20  _num != 0){.    
371d0 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68  pHostID[0] = (ch
371e0 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b  ar)(pHostID[0] +
371f0 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f   (char)(sqlite3_
37200 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46  hostid_num & 0xF
37210 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  F));.  }.#endif.
37220 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
37230 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
37240 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
37250 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c  ains the header,
37260 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63   host id and loc
37270 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a  k file path. */.
37280 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f  #define PROXY_CO
37290 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f  NCHVERSION 2   /
372a0 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c  * 1-byte header,
372b0 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64   16-byte host id
372c0 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e  , path */.#defin
372d0 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  e PROXY_HEADERLE
372e0 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63  N    1   /* conc
372f0 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65  h file header le
37300 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ngth */.#define 
37310 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
37320 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52     (PROXY_HEADER
37330 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
37340 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f  LEN).#define PRO
37350 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20  XY_MAXCONCHLEN  
37360 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
37370 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
37380 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a  +MAXPATHLEN)../*
37390 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70   .** Takes an op
373a0 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63  en conch file, c
373b0 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  opies the conten
373c0 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68  ts to a new path
373d0 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20   and then moves 
373e0 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68  .** it back.  Th
373f0 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  e newly created 
37400 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63  file's file desc
37410 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e  riptor is assign
37420 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ed to the.** con
37430 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  ch file structur
37440 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68  e and finally th
37450 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68  e original conch
37460 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
37470 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20   is .** closed. 
37480 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   Returns zero if
37490 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
374a0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
374b0 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75  BreakConchLock(u
374c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
374d0 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29  uuid_t myHostID)
374e0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
374f0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
37500 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
37510 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
37520 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
37530 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
37540 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
37550 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74  chFile;.  char t
37560 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
37570 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f  ;.  char buf[PRO
37580 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
37590 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d  .  char *cPath =
375a0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
375b0 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72  Path;.  size_t r
375c0 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69  eadLen = 0;.  si
375d0 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30  ze_t pathLen = 0
375e0 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b  ;.  char errmsg[
375f0 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20  64] = "";.  int 
37600 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  fd = -1;.  int r
37610 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44  c = -1;.  UNUSED
37620 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73  _PARAMETER(myHos
37630 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  tID);..  /* crea
37640 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
37650 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
37660 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
37670 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
37680 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
37690 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
376a0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
376b0 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
376c0 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
376d0 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
376e0 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
376f0 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
37700 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
37710 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
37720 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
37730 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20  g),errmsg,"path 
37740 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
37750 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20  (int)pathLen);. 
37760 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
37770 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
37780 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63  read the conch c
37790 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64  ontent */.  read
377a0 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  Len = osPread(co
377b0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
377c0 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
377d0 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
377e0 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
377f0 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c  INDEX ){.    sql
37800 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
37810 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
37820 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20  msg,"read error 
37830 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72  (len %d)",(int)r
37840 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
37850 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
37860 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
37870 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
37880 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
37890 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62  le */.  fd = rob
378a0 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20  ust_open(tPath, 
378b0 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
378c0 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69  O_EXCL), 0);.  i
378d0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73  f( fd<0 ){.    s
378e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
378f0 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
37900 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20  errmsg, "create 
37910 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
37920 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
37930 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
37940 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65  }.  if( osPwrite
37950 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65  (fd, buf, readLe
37960 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f  n, 0) != (ssize_
37970 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20  t)readLen ){.   
37980 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
37990 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
379a0 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65  , errmsg, "write
379b0 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
379c0 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
379d0 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
379e0 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28   }.  if( rename(
379f0 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b  tPath, cPath) ){
37a00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
37a10 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
37a20 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72  msg), errmsg, "r
37a30 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64  ename failed (%d
37a40 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
37a50 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
37a60 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ck;.  }.  rc = 0
37a70 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
37a80 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65  rr, "broke stale
37a90 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20   lock on %s\n", 
37aa0 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74  cPath);.  robust
37ab0 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f  _close(pFile, co
37ac0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  nchFile->h, __LI
37ad0 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69  NE__);.  conchFi
37ae0 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f  le->h = fd;.  co
37af0 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
37b00 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
37b10 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61  CREAT;..end_brea
37b20 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20  klock:.  if( rc 
37b30 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  ){.    if( fd>=0
37b40 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
37b50 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
37b60 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
37b70 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ile, fd, __LINE_
37b80 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  _);.    }.    fp
37b90 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
37ba0 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
37bb0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
37bc0 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
37bd0 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
37be0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
37bf0 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
37c00 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
37c10 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
37c20 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
37c30 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
37c40 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  id matches..*/.s
37c50 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
37c60 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
37c70 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
37c80 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c   myHostID, int l
37c90 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78  ockType){.  prox
37ca0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37cb0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
37cc0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
37cd0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
37ce0 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
37cf0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
37d00 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
37d10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37d20 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69  E_OK;.  int nTri
37d30 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  es = 0;.  struct
37d40 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d   timespec conchM
37d50 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d  odTime;.  .  mem
37d60 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d  set(&conchModTim
37d70 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e  e, 0, sizeof(con
37d80 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64  chModTime));.  d
37d90 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e  o {.    rc = con
37da0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
37db0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
37dc0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
37dd0 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
37de0 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69  nTries ++;.    i
37df0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
37e00 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  SY ){.      /* I
37e10 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65  f the lock faile
37e20 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20  d (busy):.      
37e30 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20   * 1st try: get 
37e40 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20  the mod time of 
37e50 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20  the conch, wait 
37e60 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61  0.5s and try aga
37e70 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e  in. .       * 2n
37e80 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74  d try: fail if t
37e90 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e  he mod time chan
37ea0 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69  ged or host id i
37eb0 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69  s different, wai
37ec0 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20  t .       *     
37ed0 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64        10 sec and
37ee0 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20   try again.     
37ef0 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65    * 3rd try: bre
37f00 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65  ak the lock unle
37f10 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  ss the mod time 
37f20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20  has changed..   
37f30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72      */.      str
37f40 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
37f50 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
37f60 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62  conchFile->h, &b
37f70 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  uf) ){.        p
37f80 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
37f90 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
37fa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
37fb0 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
37fc0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
37fd0 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b  if( nTries==1 ){
37fe0 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f  .        conchMo
37ff0 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d  dTime = buf.st_m
38000 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20  timespec;.      
38010 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 30 29    usleep(500000)
38020 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65  ; /* wait 0.5 se
38030 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
38040 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20  ck again*/.     
38050 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
38060 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
38070 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29  sert( nTries>1 )
38080 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63  ;.      if( conc
38090 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20  hModTime.tv_sec 
380a0 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
380b0 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20  pec.tv_sec || . 
380c0 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64          conchMod
380d0 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20  Time.tv_nsec != 
380e0 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
380f0 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20  .tv_nsec ){.    
38100 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
38110 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a  E_BUSY;.      }.
38120 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
38130 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a   nTries==2 ){  .
38140 20 20 20 20 20 20 20 20 63 68 61 72 20 74 42 75          char tBu
38150 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
38160 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e  LEN];.        in
38170 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28  t len = osPread(
38180 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42  conchFile->h, tB
38190 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
381a0 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20  CHLEN, 0);.     
381b0 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a     if( len<0 ){.
381c0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
381d0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
381e0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  no;.          re
381f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
38200 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
38210 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  }.        if( le
38220 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n>PROXY_PATHINDE
38230 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63  X && tBuf[0]==(c
38240 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
38250 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20  ERSION){.       
38260 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61     /* don't brea
38270 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68  k the lock if th
38280 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27  e host id doesn'
38290 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  t match */.     
382a0 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63       if( 0!=memc
382b0 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48  mp(&tBuf[PROXY_H
382c0 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73  EADERLEN], myHos
382d0 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  tID, PROXY_HOSTI
382e0 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  DLEN) ){.       
382f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
38300 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
38310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
38320 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
38330 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65   don't break the
38340 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72   lock on short r
38350 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e  ead or a version
38360 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20   mismatch */.   
38370 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
38380 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
38390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c     }.        usl
383a0 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f  eep(10000000); /
383b0 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61 6e  * wait 10 sec an
383c0 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
383d0 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  gain */.        
383e0 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20  continue; .     
383f0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
38400 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d  assert( nTries==
38410 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  3 );.      if( 0
38420 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  ==proxyBreakConc
38430 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
38440 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20  ostID) ){.      
38450 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
38460 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f  ;.        if( lo
38470 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  ckType==EXCLUSIV
38480 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
38490 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
384a0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
384b0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
384c0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41  *)conchFile, SHA
384d0 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20  RED_LOCK);      
384e0 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20      .        }. 
384f0 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29         if( !rc )
38500 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
38510 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
38520 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
38530 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
38540 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
38550 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38560 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c  }.    }.  } whil
38570 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
38580 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29  SY && nTries<3 )
38590 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  ;.  .  return rc
385a0 3