/ Hex Artifact Content
Login

Artifact a6ed7d9ae6e2308b61bd842d6aa296727d26b4fd:


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 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0c80: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0c90: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0cb0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0cc0: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
0cd0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
0ce0: 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f  ) && ((__MAC_OS_
0cf0: 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
0d00: 51 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c  QUIRED > 1050) |
0d10: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0d30: 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53  __IPHONE_OS_VERS
0d40: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
0d50: 20 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20   > 2000)).#  if 
0d60: 28 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54  (!defined(TARGET
0d70: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c  _OS_EMBEDDED) ||
0d80: 20 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45   (TARGET_OS_EMBE
0d90: 44 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20  DDED==0)) \.    
0da0: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
0db0: 54 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49  TARGET_IPHONE_SI
0dc0: 4d 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52  MULATOR) || (TAR
0dd0: 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c  GET_IPHONE_SIMUL
0de0: 41 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64  ATOR==0)).#    d
0df0: 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f  efine HAVE_GETHO
0e00: 53 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65  STUUID 1.#  else
0e10: 0a 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67  .#    warning "g
0e20: 65 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20  ethostuuid() is 
0e30: 64 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e  disabled.".#  en
0e40: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  dif.#endif...#if
0e50: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e   OS_VXWORKS.# in
0e60: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
0e70: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0e80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e  emaphore.h>.# in
0e90: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0ea0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
0eb0: 57 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65  WORKS */..#if de
0ec0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0ed0: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
0ee0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
0ef0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
0f00: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
0f10: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
0f20: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
0f30: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
0f40: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0f50: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
0f60: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
0f70: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
0f80: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
0f90: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
0fa0: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
0fb0: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
0fc0: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
0fd0: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
0fe0: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
0ff0: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
1000: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1010: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
1020: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
1030: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
1040: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
1050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1060: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1070: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
1080: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
1090: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
10a0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
10b0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
10c0: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
10d0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
10e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
10f0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1100: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1110: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1120: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1130: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1140: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
1150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1160: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1170: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1190: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
11a0: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
11b0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
11c0: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 20 41 6c  HNAME 512../* Al
11d0: 77 61 79 73 20 63 61 73 74 20 74 68 65 20 67 65  ways cast the ge
11e0: 74 70 69 64 28 29 20 72 65 74 75 72 6e 20 74 79  tpid() return ty
11f0: 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  pe for compatibi
1200: 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72  lity with.** ker
1210: 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56  nel modules in V
1220: 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69  xWorks. */.#defi
1230: 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29 20 28  ne osGetpid(X) (
1240: 70 69 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a  pid_t)getpid()..
1250: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1260: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1270: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1280: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1290: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
12a0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
12b0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
12c0: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
12d0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
12e0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
12f0: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1300: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1310: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1320: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1330: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1340: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1350: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1360: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1370: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1380: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1390: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
13a0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
13b0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
13c0: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
13d0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
13e0: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
13f0: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1400: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1410: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1420: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1430: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1440: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1450: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1460: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1470: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
1480: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
1490: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
14a0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
14b0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
14c0: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
14d0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
14e0: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
14f0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1500: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1510: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1520: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1530: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1540: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1550: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1560: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1570: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
1580: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
15b0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
15c0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
15d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
15e0: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
15f0: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1600: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1610: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1620: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1630: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1640: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1650: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1660: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1670: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
1680: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
1690: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
16a0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
16b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
16c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16d0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
16e0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
16f0: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1700: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1710: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1720: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1730: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1740: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1770: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1780: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1790: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
17c0: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
17d0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1800: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1810: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1820: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1830: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1840: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1850: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1860: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1870: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1880: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1890: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
18a0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
18b0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
18e0: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
18f0: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1900: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1910: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1920: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1930: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1940: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1950: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1970: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1980: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
19a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
19d0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1a00: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1a10: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1a20: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a40: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1a50: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1a60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1a70: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1a80: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ab0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1ac0: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1ad0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ae0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1af0: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1b00: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1b10: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1b20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1b30: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1b40: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1b50: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1b60: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1b70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1b80: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1b90: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ba0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1bb0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1bc0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1bf0: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1c00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1c10: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1c20: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1c40: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1c50: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1c60: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1c80: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1c90: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1ca0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1cc0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1cd0: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1d00: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1d10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1d20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1d30: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1d40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1d50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1d60: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1d70: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1d80: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1d90: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1da0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1db0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1dc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1dd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1de0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1df0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1e00: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e10: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e20: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1e30: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1e40: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1e50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e60: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1e70: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1e80: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1e90: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1ea0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1eb0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1ec0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1ed0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1ee0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1ef0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f00: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f20: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1f30: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1f40: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1f50: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1f60: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1f70: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1f80: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
1f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fa0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
1fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1fd0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
1fe0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ff0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2000: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2010: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2020: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2040: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2050: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2060: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2070: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2080: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2090: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
20a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
20b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
20c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
20d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
20e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
20f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2100: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2110: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2120: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2130: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2140: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2150: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2160: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2170: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2180: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2190: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
21a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
21b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
21c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
21d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
21e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
21f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2200: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2210: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2220: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2230: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2240: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2250: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2260: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2270: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2280: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2290: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
22a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
22b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
22c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
22d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
22e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
22f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2300: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2310: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2320: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2330: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2340: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2350: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2360: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2370: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2380: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2390: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
23a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
23b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
23c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
23d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
23e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
23f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2400: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2410: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2420: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2430: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2440: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2450: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2460: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2470: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2480: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2490: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
24a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
24b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
24c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
24d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
24e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
24f0: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2500: 45 5f 42 4c 4f 43 4b 20 20 20 20 20 30 78 30 31  E_BLOCK     0x01
2510: 30 30 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 53  00     /* Next S
2520: 48 4d 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 6c  HM lock might bl
2530: 6f 63 6b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ock */../*.** In
2540: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
2550: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
2560: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
2570: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
2580: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
2590: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
25a0: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
25b0: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
25c0: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
25d0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
25e0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
25f0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
2600: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
2610: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
2620: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
2630: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
2640: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2650: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
2660: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
2670: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2680: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
2690: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
26a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
26b0: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
26c0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
26d0: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
26e0: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
26f0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2700: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2710: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2720: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2730: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2740: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2750: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2760: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45  ndif../*.** HAVE
2770: 5f 4d 52 45 4d 41 50 20 64 65 66 61 75 6c 74 73  _MREMAP defaults
2780: 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75   to true on Linu
2790: 78 20 61 6e 64 20 66 61 6c 73 65 20 65 76 65 72  x and false ever
27a0: 79 77 68 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a  ywhere else..*/.
27b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56  #if !defined(HAV
27c0: 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69 66 20 64  E_MREMAP).# if d
27d0: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
27e0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 47 4e  ) && defined(_GN
27f0: 55 5f 53 4f 55 52 43 45 29 0a 23 20 20 64 65 66  U_SOURCE).#  def
2800: 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  ine HAVE_MREMAP 
2810: 31 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69  1.# else.#  defi
2820: 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 30  ne HAVE_MREMAP 0
2830: 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
2840: 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63 69 74 6c  ./*.** Explicitl
2850: 79 20 63 61 6c 6c 20 74 68 65 20 36 34 2d 62 69  y call the 64-bi
2860: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 6c 73 65  t version of lse
2870: 65 6b 28 29 20 6f 6e 20 41 6e 64 72 6f 69 64 2e  ek() on Android.
2880: 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 73 65 65   Otherwise, lsee
2890: 6b 28 29 0a 2a 2a 20 69 73 20 74 68 65 20 33 32  k().** is the 32
28a0: 2d 62 69 74 20 76 65 72 73 69 6f 6e 2c 20 65 76  -bit version, ev
28b0: 65 6e 20 69 66 20 5f 46 49 4c 45 5f 4f 46 46 53  en if _FILE_OFFS
28c0: 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65  ET_BITS=64 is de
28d0: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66  fined..*/.#ifdef
28e0: 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 23 20 64   __ANDROID__.# d
28f0: 65 66 69 6e 65 20 6c 73 65 65 6b 20 6c 73 65 65  efine lseek lsee
2900: 6b 36 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  k64.#endif../*.*
2910: 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78  * Different Unix
2920: 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65   systems declare
2930: 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65   open() in diffe
2940: 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65  rent ways.  Same
2950: 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e   use.** open(con
2960: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64  st char*,int,mod
2970: 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73  e_t).  Others us
2980: 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e open(const cha
2990: 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20  r*,int,...)..** 
29a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
29b0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e  s important when
29c0: 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72   using a pointer
29d0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
29e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65  ..**.** The safe
29f0: 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77  st way to deal w
2a00: 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ith the problem 
2a10: 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65  is to always use
2a20: 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a   this wrapper.**
2a30: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68 61   which always ha
2a40: 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d  s the same well-
2a50: 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63  defined interfac
2a60: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2a70: 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74   posixOpen(const
2a80: 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e   char *zFile, in
2a90: 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64  t flags, int mod
2aa0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  e){.  return ope
2ab0: 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  n(zFile, flags, 
2ac0: 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  mode);.}../* For
2ad0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
2ae0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
2af0: 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
2b00: 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73   char*, int*);.s
2b10: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
2b20: 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29 3b  tpagesize(void);
2b30: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2b40: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2b50: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2b60: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2b70: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2b80: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2b90: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
2ba0: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
2bb0: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
2bc0: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
2bd0: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
2be0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2bf0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
2c00: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2c10: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2c20: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2c30: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2c40: 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79  c struct unix_sy
2c50: 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20  scall {.  const 
2c60: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2c80: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2c90: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2ca0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72  syscall_ptr pCur
2cb0: 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74  rent; /* Current
2cc0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
2cd0: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
2ce0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2cf0: 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20  tr pDefault; /* 
2d00: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  Default value */
2d10: 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20  .} aSyscall[] = 
2d20: 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20  {.  { "open",   
2d30: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2d40: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
2d50: 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65  Open,  0  },.#de
2d60: 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20  fine osOpen     
2d70: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2d80: 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61  char*,int,int))a
2d90: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
2da0: 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65  ent)..  { "close
2db0: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
2dc0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63  e3_syscall_ptr)c
2dd0: 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c  lose,      0  },
2de0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
2df0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
2e00: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70  t))aSyscall[1].p
2e10: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61  Current)..  { "a
2e20: 63 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73  ccess",       (s
2e30: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2e40: 74 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30  tr)access,     0
2e50: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41    },.#define osA
2e60: 63 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a  ccess    ((int(*
2e70: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
2e80: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  t))aSyscall[2].p
2e90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67  Current)..  { "g
2ea0: 65 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73  etcwd",       (s
2eb0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2ec0: 74 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30  tr)getcwd,     0
2ed0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47    },.#define osG
2ee0: 65 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a  etcwd    ((char*
2ef0: 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74  (*)(char*,size_t
2f00: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
2f10: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74  urrent)..  { "st
2f20: 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  at",         (sq
2f30: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2f40: 72 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20  r)stat,       0 
2f50: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74   },.#define osSt
2f60: 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  at      ((int(*)
2f70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72  (const char*,str
2f80: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
2f90: 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29  all[4].pCurrent)
2fa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50  ../*.** The DJGP
2fb0: 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72  P compiler envir
2fc0: 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73  onment looks mos
2fd0: 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62  tly like Unix, b
2fe0: 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74  ut it.** lacks t
2ff0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
3000: 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65  m call.  So rede
3010: 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20  fine fcntl() to 
3020: 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  be something.** 
3030: 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63  that always succ
3040: 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e  eeds.  This mean
3050: 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64  s that locking d
3060: 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
3070: 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42  der.** DJGPP.  B
3080: 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77  ut it is DOS - w
3090: 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65  hat did you expe
30a0: 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ct?.*/.#ifdef __
30b0: 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74  DJGPP__.  { "fst
30c0: 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20  at",        0,  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
30e0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
30f0: 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30  stat(a,b,c)    0
3100: 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20  .#else     .  { 
3110: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3120: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3130: 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20  _ptr)fstat,     
3140: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3150: 73 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74  sFstat     ((int
3160: 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73  (*)(int,struct s
3170: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35  tat*))aSyscall[5
3180: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
3190: 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61  if..  { "ftrunca
31a0: 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  te",    (sqlite3
31b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72  _syscall_ptr)ftr
31c0: 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23  uncate,  0  },.#
31d0: 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61  define osFtrunca
31e0: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
31f0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
3200: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
3210: 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20  { "fcntl",      
3220: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3230: 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20  ll_ptr)fcntl,   
3240: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3250: 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69   osFcntl     ((i
3260: 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e  nt(*)(int,int,..
3270: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70  .))aSyscall[7].p
3280: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
3290: 65 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73  ead",         (s
32a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
32b0: 74 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30  tr)read,       0
32c0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52    },.#define osR
32d0: 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65  ead      ((ssize
32e0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
32f0: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
3300: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
3310: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
3320: 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f  READ) || SQLITE_
3330: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
3340: 54 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22  TYLE.  { "pread"
3350: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3360: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3370: 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ead,      0  },.
3380: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3390: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
33a0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
33b0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
33c0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
33d0: 6f 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73  osPread     ((ss
33e0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
33f0: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3400: 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75  )aSyscall[9].pCu
3410: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3420: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
3430: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
3440: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3450: 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36  scall_ptr)pread6
3460: 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  4,    0  },.#els
3470: 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c  e.  { "pread64",
3480: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3490: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
34a0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
34b0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72  dif.#define osPr
34c0: 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f  ead64   ((ssize_
34d0: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
34e0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  ize_t,off_t))aSy
34f0: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
3500: 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22  nt)..  { "write"
3510: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3520: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72  3_syscall_ptr)wr
3530: 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ite,      0  },.
3540: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20  #define osWrite 
3550: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3560: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3570: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
3580: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
3590: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
35a0: 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54  _PREAD) || SQLIT
35b0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
35c0: 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69  _STYLE.  { "pwri
35d0: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
35e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35f0: 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d  pwrite,     0  }
3600: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
3610: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
3620: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3630: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3640: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3650: 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28  e osPwrite    ((
3660: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3670: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3680: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
36a0: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
36b0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
36c0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
36d0: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
36e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
36f0: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36  call_ptr)pwrite6
3700: 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  4,   0  },.#else
3710: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
3720: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3730: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3740: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3750: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3760: 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74  ite64  ((ssize_t
3770: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3780: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3790: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
37a0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
37b0: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
37c0: 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20    { "fchmod",   
37d0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
37e0: 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c  call_ptr)fchmod,
37f0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3800: 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64  #define osFchmod
3810: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3820: 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c  ,mode_t))aSyscal
3830: 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[14].pCurrent).
3840: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
3850: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
3860: 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
3870: 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22  _FALLOCATE.  { "
3880: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3890: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
38a0: 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ptr)posix_falloc
38b0: 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ate,  0 },.#else
38c0: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
38d0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
38e0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3900: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3910: 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e  osFallocate ((in
3920: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f  t(*)(int,off_t,o
3930: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
3940: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
3950: 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20  { "unlink",     
3960: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3970: 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20  ll_ptr)unlink,  
3980: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3990: 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20  efine osUnlink  
39a0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
39b0: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
39c0: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
39d0: 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f    { "openDirecto
39e0: 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  ry",    (sqlite3
39f0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65  _syscall_ptr)ope
3a00: 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20  nDirectory,     
3a10: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3a20: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28  OpenDirectory ((
3a30: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3a40: 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c  r*,int*))aSyscal
3a50: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
3a60: 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20  .  { "mkdir",   
3a70: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3a80: 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c  scall_ptr)mkdir,
3a90: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3aa0: 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20  #define osMkdir 
3ab0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
3ac0: 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29  st char*,mode_t)
3ad0: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
3ae0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d  urrent)..  { "rm
3af0: 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71  dir",        (sq
3b00: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3b10: 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20  r)rmdir,        
3b20: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3b30: 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e  osRmdir     ((in
3b40: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3b50: 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70  ))aSyscall[19].p
3b60: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
3b70: 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73  chown",       (s
3b80: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3b90: 74 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20  tr)fchown,      
3ba0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3bb0: 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69   osFchown    ((i
3bc0: 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c  nt(*)(int,uid_t,
3bd0: 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  gid_t))aSyscall[
3be0: 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  20].pCurrent).. 
3bf0: 20 7b 20 22 67 65 74 65 75 69 64 22 2c 20 20 20   { "geteuid",   
3c00: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3c10: 61 6c 6c 5f 70 74 72 29 67 65 74 65 75 69 64 2c  all_ptr)geteuid,
3c20: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3c30: 65 66 69 6e 65 20 6f 73 47 65 74 65 75 69 64 20  efine osGeteuid 
3c40: 20 20 28 28 75 69 64 5f 74 28 2a 29 28 76 6f 69    ((uid_t(*)(voi
3c50: 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e  d))aSyscall[21].
3c60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3c70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3c80: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
3c90: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
3ca0: 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20  >0.  { "mmap",  
3cb0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3cc0: 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20  scall_ptr)mmap, 
3cd0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3ce0: 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28   osMmap ((void*(
3cf0: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
3d00: 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f  int,int,int,off_
3d10: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e  t))aSyscall[22].
3d20: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3d30: 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28  munmap",       (
3d40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3d50: 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20  ptr)munmap,     
3d60: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3d70: 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69  e osMunmap ((voi
3d80: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3d90: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d  _t))aSyscall[23]
3da0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3db0: 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 7b 20  HAVE_MREMAP.  { 
3dc0: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
3dd0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3de0: 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20  _ptr)mremap,    
3df0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3e00: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
3e10: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3e20: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3e30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3e40: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3e50: 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMremap ((void*(
3e60: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
3e70: 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29  size_t,int,...))
3e80: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
3e90: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74  rrent)..  { "get
3ea0: 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c  pagesize",  (sql
3eb0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3ec0: 29 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65  )unixGetpagesize
3ed0: 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f  , 0 },.#define o
3ee0: 73 47 65 74 70 61 67 65 73 69 7a 65 20 28 28 69  sGetpagesize ((i
3ef0: 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79 73  nt(*)(void))aSys
3f00: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
3f10: 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e  t)..  { "readlin
3f20: 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  k",     (sqlite3
3f30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61  _syscall_ptr)rea
3f40: 64 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 30 20  dlink,        0 
3f50: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  },.#define osRea
3f60: 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74 28  dlink ((ssize_t(
3f70: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  *)(const char*,c
3f80: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
3f90: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
3fa0: 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20  nt)..#endif..}; 
3fb0: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
3fc0: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
3fd0: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a 2f 2a 0a  m calls */.../*.
3fe0: 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  ** On some syste
3ff0: 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68  ms, calls to fch
4000: 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67  own() will trigg
4010: 65 72 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  er a message in 
4020: 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f  a security.** lo
4030: 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66  g if they come f
4040: 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f  rom non-root pro
4050: 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69  cesses.  So avoi
4060: 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e  d calling fchown
4070: 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20  () if.** we are 
4080: 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72  not running as r
4090: 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oot..*/.static i
40a0: 6e 74 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28  nt robustFchown(
40b0: 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20 75 69  int fd, uid_t ui
40c0: 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b 0a 23  d, gid_t gid){.#
40d0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
40e0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
40f0: 20 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65 75    return osGeteu
4100: 69 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63 68  id() ? 0 : osFch
4110: 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b  own(fd,uid,gid);
4120: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
4130: 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65   This is the xSe
4140: 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65  tSystemCall() me
4150: 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f  thod of sqlite3_
4160: 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  vfs for all of t
4170: 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53  he.** "unix" VFS
4180: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4190: 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65  TE_OK opon succe
41a0: 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67  ssfully updating
41b0: 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63   the.** system c
41c0: 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20  all pointer, or 
41d0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
41e0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
41f0: 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73  onfigurable.** s
4200: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64  ystem call named
4210: 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   zName..*/.stati
4220: 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73  c int unixSetSys
4230: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
4240: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
4250: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
4260: 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f  VFS pointer.  No
4270: 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
4280: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
4290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
42a0: 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c  e of system call
42b0: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a   to override */.
42c0: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
42d0: 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20  l_ptr pNewFunc  
42e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
42f0: 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61  w system call va
4300: 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  lue */.){.  unsi
4310: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e  gned int i;.  in
4320: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
4330: 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45  TFOUND;..  UNUSE
4340: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
4350: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Used);.  if( zNa
4360: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
4370: 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67  If no zName is g
4380: 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c  iven, restore al
4390: 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74  l system calls t
43a0: 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a  o their default.
43b0: 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20      ** settings 
43c0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a  and return NULL.
43d0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
43e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66  SQLITE_OK;.    f
43f0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4400: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4410: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4420: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4430: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4440: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
4450: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4460: 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  rent = aSyscall[
4470: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
4480: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
4490: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e  se{.    /* If zN
44a0: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
44b0: 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c  , operate on onl
44c0: 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d  y the one system
44d0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65   call.    ** spe
44e0: 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cified..    */. 
44f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
4500: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
4510: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
4520: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
4530: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
4540: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
4550: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
4560: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
4570: 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29  i].pDefault==0 )
4580: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73  {.          aSys
4590: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
45a0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
45b0: 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20  Current;.       
45c0: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
45d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
45e0: 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d     if( pNewFunc=
45f0: 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20  =0 ) pNewFunc = 
4600: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4610: 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53  ault;.        aS
4620: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4630: 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20  nt = pNewFunc;. 
4640: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4660: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4670: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4680: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74   value of a syst
4690: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
46a0: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69   NULL if zName i
46b0: 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67  s not a.** recog
46c0: 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c  nized system cal
46d0: 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73  l name.  NULL is
46e0: 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
46f0: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
4700: 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  l.** is currentl
4710: 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  y undefined..*/.
4720: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
4730: 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47  yscall_ptr unixG
4740: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
4750: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
4760: 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63  tUsed,.  const c
4770: 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20  har *zName.){.  
4780: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
4790: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
47a0: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
47b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
47c0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
47d0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
47e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
47f0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
4800: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
4810: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  ==0 ) return aSy
4820: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4830: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
4840: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
4850: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
4860: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
4870: 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65  call after zName
4880: 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c  .  If zName==NUL
4890: 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  L.** then return
48a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
48b0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
48c0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
48d0: 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20   if zName.** is 
48e0: 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20  the last system 
48f0: 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65  call or if zName
4900: 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
4910: 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73   of a valid.** s
4920: 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73  ystem call..*/.s
4930: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
4940: 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d   *unixNextSystem
4950: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
4960: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
4970: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
4980: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
4990: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
49a0: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
49b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
49c0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
49d0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
49e0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
49f0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
4a00: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
4a10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
4a20: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
4a30: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
4a40: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
4a50: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
4a60: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
4a70: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
4a80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4a90: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61  ../*.** Do not a
4aa0: 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64  ccept any file d
4ab0: 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74  escriptor less t
4ac0: 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20  han this value, 
4ad0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
4ae0: 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74  d.** opening dat
4af0: 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67  abase file using
4b00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4b10: 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
4b20: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a  nly used for .**
4b30: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c   standard input,
4b40: 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72   output, and err
4b50: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  or..*/.#ifndef S
4b60: 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49  QLITE_MINIMUM_FI
4b70: 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20  LE_DESCRIPTOR.# 
4b80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49  define SQLITE_MI
4b90: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
4ba0: 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a  IPTOR 3.#endif..
4bb0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65  /*.** Invoke ope
4bc0: 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74  n().  Do so mult
4bd0: 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69  iple times, unti
4be0: 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63  l it either succ
4bf0: 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73  eeds or.** fails
4c00: 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e   for some reason
4c10: 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54   other than EINT
4c20: 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  R..**.** If the 
4c30: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
4c40: 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e  de "m" is 0 then
4c50: 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64   set it to the d
4c60: 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51  efault for.** SQ
4c70: 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75  Lite.  The defau
4c80: 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46  lt is SQLITE_DEF
4c90: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
4ca0: 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a  SIONS (normally.
4cb0: 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69  ** 0644) as modi
4cc0: 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74  fied by the syst
4cd0: 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20  em umask.  If m 
4ce0: 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a  is not 0, then.*
4cf0: 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
4d00: 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65  creation mode be
4d10: 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72   exactly m ignor
4d20: 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a  ing the umask..*
4d30: 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d  *.** The m param
4d40: 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e  eter will be non
4d50: 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20  -zero only when 
4d60: 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d  creating -wal, -
4d70: 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20  journal,.** and 
4d80: 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20  -shm files.  We 
4d90: 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73  want those files
4da0: 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c   to have *exactl
4db0: 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70  y* the same.** p
4dc0: 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68  ermissions as th
4dd0: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
4de0: 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72  abase, unadulter
4df0: 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  ated by the umas
4e00: 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61  k..** In that wa
4e10: 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65  y, if a database
4e20: 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d   file is -rw-rw-
4e30: 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c  rw or -rw-rw-r-,
4e40: 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61   and a.** transa
4e50: 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e  ction crashes an
4e60: 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20  d leaves behind 
4e70: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  hot journals, th
4e80: 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73  en any.** proces
4e90: 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74  s that is able t
4ea0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  o write to the d
4eb0: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73  atabase will als
4ec0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  o be able to.** 
4ed0: 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20  recover the hot 
4ee0: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61  journals..*/.sta
4ef0: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f  tic int robust_o
4f00: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
4f10: 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74  z, int f, mode_t
4f20: 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20   m){.  int fd;. 
4f30: 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f   mode_t m2 = m ?
4f40: 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41   m : SQLITE_DEFA
4f50: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
4f60: 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29  IONS;.  while(1)
4f70: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f  {.#if defined(O_
4f80: 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20  CLOEXEC).    fd 
4f90: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43  = osOpen(z,f|O_C
4fa0: 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73  LOEXEC,m2);.#els
4fb0: 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  e.    fd = osOpe
4fc0: 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69  n(z,f,m2);.#endi
4fd0: 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  f.    if( fd<0 )
4fe0: 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
4ff0: 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69  o==EINTR ) conti
5000: 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nue;.      break
5010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5020: 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  fd>=SQLITE_MINIM
5030: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
5040: 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OR ) break;.    
5050: 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20  osClose(fd);.   
5060: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
5070: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20  ITE_WARNING, .  
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 61                "a
5090: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c  ttempt to open \
50a0: 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65  "%s\" as file de
50b0: 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c  scriptor %d", z,
50c0: 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d   fd);.    fd = -
50d0: 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65  1;.    if( osOpe
50e0: 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66  n("/dev/null", f
50f0: 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , m)<0 ) break;.
5100: 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20    }.  if( fd>=0 
5110: 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20  ){.    if( m!=0 
5120: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
5130: 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20  stat statbuf;.  
5140: 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
5150: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30  fd, &statbuf)==0
5160: 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61 74   .       && stat
5170: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20  buf.st_size==0. 
5180: 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62 75        && (statbu
5190: 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21  f.st_mode&0777)!
51a0: 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =m .      ){.   
51b0: 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64       osFchmod(fd
51c0: 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , m);.      }.  
51d0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
51e0: 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28  FD_CLOEXEC) && (
51f0: 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58  !defined(O_CLOEX
5200: 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43  EC) || O_CLOEXEC
5210: 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c  ==0).    osFcntl
5220: 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
5230: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
5240: 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
5250: 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  EC);.#endif.  }.
5260: 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a    return fd;.}..
5270: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
5280: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
5290: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
52a0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
52b0: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
52c0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
52d0: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
52e0: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
52f0: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
5300: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
5310: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
5320: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
5330: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
5340: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
5350: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
5360: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
5370: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
5380: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
5390: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
53a0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
53b0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
53c0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
53d0: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
53e0: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
53f0: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
5400: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
5410: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
5420: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
5430: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
5440: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
5450: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
5460: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
5470: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
5480: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
5490: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
54a0: 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b  X_STATIC_VFS1));
54b0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
54c0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  nixLeaveMutex(vo
54d0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
54e0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
54f0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
5500: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
5510: 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66 64 65  _VFS1));.}.#ifde
5520: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
5530: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75  tatic int unixMu
5540: 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
5550: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5560: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
5570: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
5580: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5590: 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64  C_VFS1));.}.#end
55a0: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
55b0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
55c0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
55d0: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
55e0: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
55f0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
5600: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
5610: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
5620: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
5630: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
5640: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
5650: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
5660: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
5670: 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c  st char *azFileL
5680: 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63  ock(int eFileLoc
5690: 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46  k){.  switch( eF
56a0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63  ileLock ){.    c
56b0: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
56c0: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
56d0: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
56e0: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
56f0: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
5700: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
5710: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
5720: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
5730: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
5740: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
5750: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
5760: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
5770: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
5780: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
5790: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
57a0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
57b0: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
57c0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
57d0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
57e0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
57f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5800: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
5810: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
5820: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
5830: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
5840: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
5850: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
5860: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
5870: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
5880: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
5890: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
58a0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
58b0: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
58c0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
58d0: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
58e0: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
58f0: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
5900: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
5910: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
5920: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
5930: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
5940: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
5950: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
5960: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
5970: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
5980: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
5990: 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28      s = osFcntl(
59a0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
59b0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
59c0: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
59d0: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
59e0: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
59f0: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
5a00: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
5a10: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
5a20: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
5a30: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
5a40: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
5a50: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
5a60: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
5a70: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
5a80: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
5a90: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
5aa0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5ab0: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
5ac0: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
5ad0: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
5ae0: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
5af0: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
5b00: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
5b10: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5b20: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
5b30: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
5b40: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
5b50: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
5b60: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
5b70: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
5b80: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
5b90: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
5ba0: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
5bb0: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
5bc0: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
5bd0: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
5be0: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
5bf0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
5c00: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
5c10: 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
5c20: 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20  F_GETLK, &l2);. 
5c30: 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65     if( l2.l_type
5c40: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
5c50: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
5c60: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
5c70: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( l2.l_type==F_W
5c80: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  RLCK ){.      zT
5c90: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
5ca0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
5cb0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
5cc0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
5cd0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "UNLCK";.    }e
5ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
5cf0: 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t( 0 );.    }.  
5d00: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5d10: 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c  intf("fcntl-fail
5d20: 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25  ure-reason: %s %
5d30: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
5d40: 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c     zType, (int)l
5d50: 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  2.l_start, (int)
5d60: 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c  l2.l_len, (int)l
5d70: 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20  2.l_pid);.  }.  
5d80: 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72  errno = savedErr
5d90: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a  no;.  return s;.
5da0: 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c  }.#undef osFcntl
5db0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c  .#define osFcntl
5dc0: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
5dd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
5de0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
5df0: 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74 65   Retry ftruncate
5e00: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
5e10: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
5e20: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20  **.** All calls 
5e30: 74 6f 20 66 74 72 75 6e 63 61 74 65 28 29 20 77  to ftruncate() w
5e40: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ithin this file 
5e50: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74  should be made t
5e60: 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20 77  hrough.** this w
5e70: 72 61 70 70 65 72 2e 20 20 4f 6e 20 74 68 65 20  rapper.  On the 
5e80: 41 6e 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d  Android platform
5e90: 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
5ea0: 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20 63  logic below.** c
5eb0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 63  ould lead to a c
5ec0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
5ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5ee0: 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
5ef0: 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69  int h, sqlite3_i
5f00: 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20  nt64 sz){.  int 
5f10: 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  rc;.#ifdef __AND
5f20: 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41  ROID__.  /* On A
5f30: 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74  ndroid, ftruncat
5f40: 65 28 29 20 61 6c 77 61 79 73 20 75 73 65 73 20  e() always uses 
5f50: 33 32 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20  32-bit offsets, 
5f60: 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46  even if .  ** _F
5f70: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d  ILE_OFFSET_BITS=
5f80: 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  64 is defined. T
5f90: 68 69 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20  his means it is 
5fa0: 75 6e 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70  unsafe to attemp
5fb0: 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61  t to.  ** trunca
5fc0: 74 65 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79  te a file to any
5fd0: 20 73 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61   size larger tha
5fe0: 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79  n 2GiB. Silently
5ff0: 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   ignore any.  **
6000: 20 73 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20   such attempts. 
6010: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71   */.  if( sz>(sq
6020: 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46  lite3_int64)0x7F
6030: 46 46 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63  FFFFFF ){.    rc
6040: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6050: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64  }else.#endif.  d
6060: 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63  o{ rc = osFtrunc
6070: 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c  ate(h,sz); }whil
6080: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
6090: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
60a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
60b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
60c0: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
60d0: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
60e0: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
60f0: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
6100: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
6110: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
6120: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
6130: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
6140: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
6150: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
6160: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
6170: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
6180: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
6190: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
61a0: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
61b0: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
61c0: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
61d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
61e0: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
61f0: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
6200: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
6210: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6220: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
6230: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
6240: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
6250: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
6260: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
6270: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
6280: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
6290: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
62a0: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
62b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 28 73 71 6c  {.  assert( (sql
62c0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
62d0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
62e0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 73 71  | .          (sq
62f0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
6300: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
6310: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
6320: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6330: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
6340: 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  OCK) ||.        
6350: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
6360: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
6370: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
6380: 29 20 29 3b 0a 20 20 73 77 69 74 63 68 20 28 70  ) );.  switch (p
6390: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63  osixError) {.  c
63a0: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 63  ase EACCES: .  c
63b0: 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61  ase EAGAIN:.  ca
63c0: 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20  se ETIMEDOUT:.  
63d0: 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61  case EBUSY:.  ca
63e0: 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65  se EINTR:.  case
63f0: 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f   ENOLCK:  .    /
6400: 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74  * random NFS ret
6410: 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73  ry error, unless
6420: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
6430: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
6440: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
6450: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
6460: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
6470: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20  at it says */.  
6480: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6490: 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73  BUSY;.    .  cas
64a0: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
64b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
64c0: 3b 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74  ;.    .  default
64d0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  : .    return sq
64e0: 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d  liteIOErr;.  }.}
64f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
6500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6540: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
6550: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
6560: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
6570: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
6580: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
6590: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
65a0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
65b0: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
65c0: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
65d0: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
65e0: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
65f0: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
6600: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
6610: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
6620: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
6630: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
6640: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
6650: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
6660: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
6670: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
6680: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
6690: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
66a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
66b0: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
66c0: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
66d0: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
66e0: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
66f0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
6700: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
6710: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
6720: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
6730: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
6740: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
6750: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
6760: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
6770: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
6780: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
6790: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
67a0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
67b0: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
67c0: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
67d0: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
67e0: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
67f0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
6800: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
6810: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
6820: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
6830: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
6840: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
6850: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
6860: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6870: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
6880: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
6890: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
68a0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
68b0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
68e0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
68f0: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
6900: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
6910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
6920: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
6930: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
6940: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
6950: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
6960: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
6970: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
6980: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
6990: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
69a0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
69b0: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
69c0: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
69d0: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
69e0: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
69f0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6a00: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
6a10: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
6a20: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
6a30: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
6a40: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
6a50: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
6a60: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
6a70: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
6a80: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
6a90: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
6aa0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
6ab0: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
6ac0: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
6ad0: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
6ae0: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
6af0: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
6b00: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
6b10: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
6b20: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
6b30: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
6b40: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
6b50: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
6b60: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
6b70: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
6b80: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
6b90: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
6ba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
6bb0: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
6bc0: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
6bd0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
6be0: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
6bf0: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
6c00: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
6c10: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
6c20: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
6c30: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
6c40: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
6c50: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
6c60: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
6c70: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
6c80: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
6c90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
6ca0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6cb0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
6cc0: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
6cd0: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
6ce0: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
6cf0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
6d00: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
6d10: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
6d20: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
6d30: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
6d40: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
6d50: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6d60: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
6d70: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
6d80: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
6d90: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
6da0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
6db0: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
6dc0: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
6dd0: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
6de0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6df0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
6e00: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
6e10: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
6e20: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
6e30: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
6e40: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
6e50: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
6e60: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
6e70: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
6e80: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
6e90: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
6ea0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
6eb0: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
6ec0: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
6ed0: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
6ee0: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
6ef0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6f00: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
6f10: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6f20: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
6f30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
6f40: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
6f50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
6f60: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
6f70: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6f80: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
6f90: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
6fa0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
6fb0: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
6fc0: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
6fd0: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
6fe0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
6ff0: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
7000: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7020: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
7030: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
7040: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
7050: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
7060: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
7070: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
7080: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
7090: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
70a0: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
70b0: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b  eof(*pNew) + (n+
70c0: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  1) );.  if( pNew
70d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
70e0: 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63    pNew->zCanonic
70f0: 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  alName = (char*)
7100: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63  &pNew[1];.  memc
7110: 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  py(pNew->zCanoni
7120: 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75  calName, zAbsolu
7130: 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20  teName, n+1);.  
7140: 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c  n = vxworksSimpl
7150: 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43  ifyName(pNew->zC
7160: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
7170: 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
7180: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  or an existing e
7190: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69  ntry that matchi
71a0: 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  ng the canonical
71b0: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66   name..  ** If f
71c0: 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20  ound, increment 
71d0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
71e0: 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  unt and return a
71f0: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a   pointer to.  **
7200: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69   the existing fi
7210: 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e  le ID..  */.  un
7220: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
7230: 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65    for(pCandidate
7240: 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  =vxworksFileList
7250: 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43  ; pCandidate; pC
7260: 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64  andidate=pCandid
7270: 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ate->pNext){.   
7280: 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d   if( pCandidate-
7290: 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20  >nName==n .     
72a0: 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69  && memcmp(pCandi
72b0: 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  date->zCanonical
72c0: 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e  Name, pNew->zCan
72d0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d  onicalName, n)==
72e0: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  0.    ){.       
72f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
7300: 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64  w);.       pCand
7310: 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  idate->nRef++;. 
7320: 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
7330: 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72  utex();.       r
7340: 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65  eturn pCandidate
7350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7360: 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66  * No match was f
7370: 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d  ound.  We will m
7380: 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49  ake a new file I
7390: 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65  D */.  pNew->nRe
73a0: 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e  f = 1;.  pNew->n
73b0: 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77  Name = n;.  pNew
73c0: 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b  ->pNext = vxwork
73d0: 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77  sFileList;.  vxw
73e0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70  orksFileList = p
73f0: 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  New;.  unixLeave
7400: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
7410: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7420: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
7430: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
7440: 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  n a vxworksFileI
7450: 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a  d object.  Free.
7460: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68  ** the object wh
7470: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
7480: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
7490: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ero..*/.static v
74a0: 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  oid vxworksRelea
74b0: 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20  seFileId(struct 
74c0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
74d0: 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72  Id){.  unixEnter
74e0: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
74f0: 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29  t( pId->nRef>0 )
7500: 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pId->nRef--;
7510: 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66  .  if( pId->nRef
7520: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
7530: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7540: 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70  **pp;.    for(pp
7550: 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  =&vxworksFileLis
7560: 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70  t; *pp && *pp!=p
7570: 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29  Id; pp = &((*pp)
7580: 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20  ->pNext)){}.    
7590: 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64  assert( *pp==pId
75a0: 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49   );.    *pp = pI
75b0: 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  d->pNext;.    sq
75c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b  lite3_free(pId);
75d0: 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
75e0: 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69  Mutex();.}.#endi
75f0: 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
7600: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
7610: 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75  *** End of Uniqu
7620: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
7630: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
7640: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
7650: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
7660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76a0: 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
76b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76f0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
7700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7710: 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20   Posix Advisory 
7720: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7740: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58  ****.**.** POSIX
7750: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
7760: 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65  are broken by de
7770: 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20  sign.  ANSI STD 
7780: 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a  1003.1 (1996).**
7790: 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32   section 6.5.2.2
77a0: 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75   lines 483 throu
77b0: 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74  gh 490 specify t
77c0: 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65  hat when a proce
77d0: 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c  ss.** sets or cl
77e0: 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61  ears a lock, tha
77f0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72  t operation over
7800: 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20  rides any prior 
7810: 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20  locks set.** by 
7820: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7830: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65  .  It does not e
7840: 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f  xplicitly say so
7850: 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69  , but this impli
7860: 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76  es.** that it ov
7870: 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65  errides locks se
7880: 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  t by the same pr
7890: 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69  ocess using a di
78a0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
78b0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e  descriptor.  Con
78c0: 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20  sider this test 
78d0: 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  case:.**.**     
78e0: 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e    int fd1 = open
78f0: 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44  ("./file1", O_RD
7900: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
7910: 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  );.**       int 
7920: 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd2 = open("./fi
7930: 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le2", O_RDWR|O_C
7940: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a  REAT, 0644);.**.
7950: 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c  ** Suppose ./fil
7960: 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61  e1 and ./file2 a
7970: 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61  re really the sa
7980: 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  me file (because
7990: 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72  .** one is a har
79a0: 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69  d or symbolic li
79b0: 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29  nk to the other)
79c0: 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74   then if you set
79d0: 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65  .** an exclusive
79e0: 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68   lock on fd1, th
79f0: 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e  en try to get an
7a00: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
7a10: 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f  ** on fd2, it wo
7a20: 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61  rks.  I would ha
7a30: 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20  ve expected the 
7a40: 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a  second lock to.*
7a50: 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65  * fail since the
7a60: 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61  re was already a
7a70: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
7a80: 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a  e due to fd1..**
7a90: 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69   But not so.  Si
7aa0: 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63  nce both locks c
7ab0: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ame from the sam
7ac0: 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a  e process, the.*
7ad0: 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64  * second overrid
7ae0: 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76  es the first, ev
7af0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
7b00: 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ere on different
7b10: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
7b20: 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64  tors opened on d
7b30: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61  ifferent file na
7b40: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  mes..**.** This 
7b50: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61  means that we ca
7b60: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
7b70: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
7b80: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a  ize file access.
7b90: 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69  ** among competi
7ba0: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
7bb0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
7bc0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
7bd0: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
7be0: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
7bf0: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
7c00: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
7c10: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
7c20: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
7c30: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
7c40: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
7c50: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
7c60: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
7c70: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
7c80: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
7c90: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
7ca0: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
7cb0: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
7cc0: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
7cd0: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
7ce0: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
7cf0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
7d00: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
7d10: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
7d20: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
7d30: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
7d40: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
7d50: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
7d60: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
7d70: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
7d80: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
7d90: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
7da0: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
7db0: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
7dc0: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
7dd0: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
7de0: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
7df0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
7e00: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
7e10: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
7e20: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
7e30: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
7e40: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
7e50: 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65   (Aside: The use
7e60: 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72   of inode number
7e70: 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20  s as unique IDs 
7e80: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
7e90: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72   VxWorks..** For
7ea0: 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76   VxWorks, we hav
7eb0: 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74  e to use the alt
7ec0: 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20  ernative unique 
7ed0: 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20  ID system based 
7ee0: 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20  on.** canonical 
7ef0: 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70  filename and imp
7f00: 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20  lemented in the 
7f10: 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f  previous divisio
7f20: 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  n.).**.** The sq
7f30: 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
7f40: 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69  ture for POSIX i
7f50: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74  s no longer just
7f60: 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65   an integer file
7f70: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20  .** descriptor. 
7f80: 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72   It is now a str
7f90: 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64  ucture that hold
7fa0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69  s the integer fi
7fb0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
7fc0: 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
7fd0: 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  o a structure th
7fe0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
7ff0: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63   internal.** loc
8000: 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73  ks on the corres
8010: 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20  ponding inode.  
8020: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63  There is one loc
8030: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a  king structure.*
8040: 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20  * per inode, so 
8050: 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  if the same inod
8060: 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63  e is opened twic
8070: 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65  e, both unixFile
8080: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70   structures.** p
8090: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65  oint to the same
80a0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
80b0: 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  re.  The locking
80c0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
80d0: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
80e0: 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c  count (so we wil
80f0: 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64  l know when to d
8100: 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20  elete it) and a 
8110: 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74  "cnt".** field t
8120: 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73  hat tells us its
8130: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
8140: 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d  tatus.  cnt==0 m
8150: 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65  eans the.** file
8160: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63   is unlocked.  c
8170: 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65  nt==-1 means the
8180: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63   file has an exc
8190: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20  lusive lock..** 
81a0: 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72  cnt>0 means ther
81b0: 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64  e are cnt shared
81c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69   locks on the fi
81d0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74  le..**.** Any at
81e0: 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72  tempt to lock or
81f0: 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66   unlock a file f
8200: 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20  irst checks the 
8210: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63  locking.** struc
8220: 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c  ture.  The fcntl
8230: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69  () system call i
8240: 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74  s only invoked t
8250: 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49  o set a .** POSI
8260: 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e  X lock if the in
8270: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75  ternal lock stru
8280: 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e  cture transition
8290: 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c  s between.** a l
82a0: 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c  ocked and an unl
82b0: 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  ocked state..**.
82c0: 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68  ** But wait:  th
82d0: 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65  ere are yet more
82e0: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50   problems with P
82f0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
8300: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f  cks..**.** If yo
8310: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  u close a file d
8320: 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70  escriptor that p
8330: 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20  oints to a file 
8340: 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a  that has locks,.
8350: 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20  ** all locks on 
8360: 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61  that file that a
8370: 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  re owned by the 
8380: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
8390: 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e  are.** released.
83a0: 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
83b0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65   this problem, e
83c0: 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ach unixInodeInf
83d0: 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e  o object.** main
83e0: 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66  tains a count of
83f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
8400: 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ending locks on 
8410: 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68  tha inode..** Wh
8420: 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
8430: 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61   made to close a
8440: 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74  n unixFile, if t
8450: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
8460: 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20  r unixFile open 
8470: 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  on the same inod
8480: 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69  e that are holdi
8490: 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61  ng locks, the ca
84a0: 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29  ll.** to close()
84b0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
84c0: 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64  ptor is deferred
84d0: 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68   until all of th
84e0: 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a  e locks clear..*
84f0: 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * The unixInodeI
8500: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65  nfo structure ke
8510: 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69  eps a list of fi
8520: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
8530: 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62  hat need to.** b
8540: 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61  e closed and tha
8550: 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64  t list is walked
8560: 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77   (and cleared) w
8570: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
8580: 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a  k.** clears..**.
8590: 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70  ** Yet another p
85a0: 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68  roblem:  LinuxTh
85b0: 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61  reads do not pla
85c0: 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69  y well with posi
85d0: 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d  x locks..**.** M
85e0: 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  any older versio
85f0: 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20  ns of linux use 
8600: 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73  the LinuxThreads
8610: 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 69   library which i
8620: 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63  s.** not posix c
8630: 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72  ompliant.  Under
8640: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61   LinuxThreads, a
8650: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
8660: 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e   thread.** A can
8670: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  not be modified 
8680: 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  or overridden by
8690: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
86a0: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74  ead B..** Only t
86b0: 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69  hread A can modi
86c0: 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f  fy the lock.  Lo
86d0: 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69  cking behavior i
86e0: 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20  s correct.** if 
86f0: 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75  the appliation u
8700: 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61  ses the newer Na
8710: 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65 61  tive Posix Threa
8720: 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29  d Library (NPTL)
8730: 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77  .** on linux - w
8740: 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20  ith NPTL a lock 
8750: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8760: 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65  d A can override
8770: 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72   locks.** in thr
8780: 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65 72  ead B.  But ther
8790: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
87a0: 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  now at compile-t
87b0: 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72  ime which.** thr
87c0: 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69  eading library i
87d0: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53  s being used.  S
87e0: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  o there is no wa
87f0: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20  y to know at.** 
8800: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
8810: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
8820: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
8830: 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61  e locks on threa
8840: 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20  d B..** One has 
8850: 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65  to do a run-time
8860: 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76   check to discov
8870: 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  er the behavior 
8880: 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  of the.** curren
8890: 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
88a0: 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20   SQLite used to 
88b0: 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72  support LinuxThr
88c0: 65 61 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f  eads.  But suppo
88d0: 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65  rt for LinuxThre
88e0: 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70  ads.** was dropp
88f0: 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ed beginning wit
8900: 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e  h version 3.7.0.
8910: 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74    SQLite will st
8920: 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a  ill work with.**
8930: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72   LinuxThreads pr
8940: 6f 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20  ovided that (1) 
8950: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65  there is no more
8960: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63   than one connec
8970: 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74  tion .** per dat
8980: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
8990: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61  e same process a
89a0: 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20  nd (2) database 
89b0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64  connections.** d
89c0: 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73  o not move acros
89d0: 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f  s threads..*/../
89e0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
89f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8a00: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
8a10: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
8a20: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
8a30: 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69  a particular uni
8a40: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
8a50: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  t..*/.struct uni
8a60: 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f  xFileId {.  dev_
8a70: 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20  t dev;          
8a80: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
8a90: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
8aa0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
8ab0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
8ac0: 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71  d *pId;  /* Uniq
8ad0: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76  ue file ID for v
8ae0: 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65  xworks. */.#else
8af0: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b10: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
8b20: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
8b30: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
8b40: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8b50: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
8b60: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
8b70: 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  open.** inode.  
8b80: 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65  Or, on LinuxThre
8b90: 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e  ads, there is on
8ba0: 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63  e of these struc
8bb0: 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63  tures for.** eac
8bc0: 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62  h inode opened b
8bd0: 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a  y each thread..*
8be0: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
8bf0: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
8c00: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
8c10: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
8c20: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
8c30: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
8c40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
8c50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
8c60: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a  object and this.
8c70: 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20  ** object keeps 
8c80: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
8c90: 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c  umber of unixFil
8ca0: 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74  e pointing to it
8cb0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
8cc0: 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74  InodeInfo {.  st
8cd0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
8ce0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a  fileId;       /*
8cf0: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
8d00: 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64  */.  int nShared
8d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8d20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8d30: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
8d40: 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  eld */.  unsigne
8d50: 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b  d char eFileLock
8d60: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
8d70: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
8d80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
8d90: 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  c. */.  unsigned
8da0: 20 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f   char bProcessLo
8db0: 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  ck;     /* An ex
8dc0: 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20  clusive process 
8dd0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a  lock is held */.
8de0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
8e10: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
8e20: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75  structure */.  u
8e30: 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
8e40: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
8e50: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
8e60: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8e70: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
8e80: 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20  int nLock;      
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
8eb0: 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f  standing file lo
8ec0: 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  cks */.  UnixUnu
8ed0: 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20  sedFd *pUnused; 
8ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
8ef0: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
8f00: 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  ors to close */.
8f10: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
8f20: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
8f30: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
8f40: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
8f50: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78  bjects */.  unix
8f60: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76  InodeInfo *pPrev
8f70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  ;           /*  
8f80: 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69    .... doubly li
8f90: 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49  nked */.#if SQLI
8fa0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
8fb0: 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e  G_STYLE.  unsign
8fc0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
8fd0: 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72  redByte;  /* for
8fe0: 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73   AFP simulated s
8ff0: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65  hared lock */.#e
9000: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ndif.#if OS_VXWO
9010: 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  RKS.  sem_t *pSe
9020: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
9030: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50        /* Named P
9040: 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a  OSIX semaphore *
9050: 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d  /.  char aSemNam
9060: 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
9070: 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ];  /* Name of t
9080: 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  hat semaphore */
9090: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
90a0: 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c  * A lists of all
90b0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
90c0: 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
90d0: 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  c unixInodeInfo 
90e0: 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  *inodeList = 0;.
90f0: 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ./*.**.** This f
9100: 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f  unction - unixLo
9110: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20  gErrorAtLine(), 
9120: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
9130: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
9140: 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f  o.** unixLogErro
9150: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  r()..**.** It is
9160: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
9170: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
9180: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
9190: 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62   and errno has b
91a0: 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c  een.** set. It l
91b0: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
91c0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
91d0: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
91e0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
91f0: 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20  f.** errno and, 
9200: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
9210: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
9220: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
9230: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a  strerror() or.**
9240: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a   strerror_r()..*
9250: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
9260: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
9270: 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75  o the macro shou
9280: 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20  ld be the error 
9290: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c  code that.** wil
92a0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
92b0: 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51   SQLite (e.g. SQ
92c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
92d0: 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
92e0: 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f  EN). .** The two
92f0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
9300: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
9310: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
9320: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
9330: 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e  .** failed (e.g.
9340: 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e   "unlink", "open
9350: 22 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ") and the assoc
9360: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
9370: 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e  m path,.** if an
9380: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e  y..*/.#define un
9390: 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63  ixLogError(a,b,c
93a0: 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  )     unixLogErr
93b0: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f  orAtLine(a,b,c,_
93c0: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
93d0: 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  int unixLogError
93e0: 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72  AtLine(.  int er
93f0: 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  rcode,          
9400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
9410: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
9420: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9430: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
9440: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
9450: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
9460: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
9470: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
9480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9490: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
94a0: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
94b0: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
94e0: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
94f0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
9500: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  /.){.  char *zEr
9510: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9520: 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67         /* Messag
9530: 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  e from strerror(
9540: 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ) or equivalent 
9550: 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20  */.  int iErrno 
9560: 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  = errno;        
9570: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79       /* Saved sy
9580: 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62  scall error numb
9590: 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  er */..  /* If t
95a0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72  his is not a thr
95b0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53  eadsafe build (S
95c0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
95d0: 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20  ==0), then use. 
95e0: 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72   ** the strerror
95f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f  () function to o
9600: 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d  btain the human-
9610: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d  readable error m
9620: 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69  essage.  ** equi
9630: 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e  valent to errno.
9640: 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
9650: 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20  strerror_r()..  
9660: 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  */ .#if SQLITE_T
9670: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
9680: 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52  ined(HAVE_STRERR
9690: 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72  OR_R).  char aEr
96a0: 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  r[80];.  memset(
96b0: 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aErr, 0, sizeof(
96c0: 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d  aErr));.  zErr =
96d0: 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20   aErr;..  /* If 
96e0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
96f0: 50 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f  P (set by autoco
9700: 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f  nf scripts) or _
9710: 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69  _USE_GNU is defi
9720: 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ned,.  ** assume
9730: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
9740: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e   provides the GN
9750: 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72  U version of str
9760: 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20  error_r() that. 
9770: 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
9780: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
9790: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
97a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
97b0: 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20  That pointer .  
97c0: 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ** may point to 
97d0: 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61  aErr[], or it ma
97e0: 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  y point to some 
97f0: 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73  static storage s
9800: 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20  omewhere. .  ** 
9810: 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d  Otherwise, assum
9820: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
9830: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50  m provides the P
9840: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20  OSIX version of 
9850: 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  .  ** strerror_r
9860: 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73  (), which always
9870: 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72   writes an error
9880: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45   message into aE
9890: 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rr[]..  **.  ** 
98a0: 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f  If the code inco
98b0: 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20  rrectly assumes 
98c0: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50  that it is the P
98d0: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61  OSIX version tha
98e0: 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61  t is.  ** availa
98f0: 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d  ble, the error m
9900: 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65  essage will ofte
9910: 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  n be an empty st
9920: 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a  ring. Not a.  **
9930: 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49   huge problem. I
9940: 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c  ncorrectly concl
9950: 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47  uding that the G
9960: 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  NU version is av
9970: 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  ailable .  ** co
9980: 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65  uld lead to a se
9990: 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20  gfault though.. 
99a0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
99b0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
99c0: 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  P) || defined(__
99d0: 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20  USE_GNU).  zErr 
99e0: 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72  = .# endif.  str
99f0: 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20  error_r(iErrno, 
9a00: 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72  aErr, sizeof(aEr
9a10: 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51  r)-1);..#elif SQ
9a20: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
9a30: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74    /* This is a t
9a40: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
9a50: 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28   but strerror_r(
9a60: 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  ) is not availab
9a70: 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  le. */.  zErr = 
9a80: 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e  "";.#else.  /* N
9a90: 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75  on-threadsafe bu
9aa0: 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ild, use strerro
9ab0: 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  r(). */.  zErr =
9ac0: 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f   strerror(iErrno
9ad0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
9ae0: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
9af0: 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65  h = "";.  sqlite
9b00: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
9b10: 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a       "os_unix.c:
9b20: 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20  %d: (%d) %s(%s) 
9b30: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
9b40: 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e  ne, iErrno, zFun
9b50: 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20  c, zPath, zErr. 
9b60: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
9b70: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
9b80: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  Close a file des
9b90: 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  criptor..**.** W
9ba0: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c  e assume that cl
9bb0: 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77  ose() almost alw
9bc0: 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65  ays works, since
9bd0: 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61   it is only in a
9be0: 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70  .** very sick ap
9bf0: 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20  plication or on 
9c00: 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74  a very sick plat
9c10: 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67  form that it mig
9c20: 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69  ht fail..** If i
9c30: 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d  t does fail, sim
9c40: 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ply leak the fil
9c50: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75  e descriptor, bu
9c60: 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20  t do log the.** 
9c70: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  error..**.** Not
9c80: 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  e that it is not
9c90: 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63   safe to retry c
9ca0: 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e  lose() after EIN
9cb0: 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  TR since the.** 
9cc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9cd0: 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61  might have alrea
9ce0: 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62  dy been reused b
9cf0: 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  y another thread
9d00: 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74  ..** So we don't
9d10: 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63   even try to rec
9d20: 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e  over from an EIN
9d30: 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68  TR.  Just log th
9d40: 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d  e error.** and m
9d50: 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ove on..*/.stati
9d60: 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c  c void robust_cl
9d70: 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ose(unixFile *pF
9d80: 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20  ile, int h, int 
9d90: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f  lineno){.  if( o
9da0: 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20  sClose(h) ){.   
9db0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9dc0: 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ine(SQLITE_IOERR
9dd0: 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c  _CLOSE, "close",
9de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9df0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20          pFile ? 
9e00: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30  pFile->zPath : 0
9e10: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d  , lineno);.  }.}
9e20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
9e30: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
9e40: 2e 20 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20  .  Do this in a 
9e50: 73 75 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68  subroutine as th
9e60: 61 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61  at provides.** a
9e70: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
9e80: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
9e90: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
9ea0: 20 76 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45   void storeLastE
9eb0: 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70  rrno(unixFile *p
9ec0: 46 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29  File, int error)
9ed0: 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  {.  pFile->lastE
9ee0: 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a  rrno = error;.}.
9ef0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
9f00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9f10: 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20  s accumuated in 
9f20: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9f30: 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  o->pUnused list.
9f40: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
9f50: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
9f60: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9f70: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
9f80: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9f90: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
9fa0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20  ixUnusedFd *p;. 
9fb0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
9fc0: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49  Next;.  for(p=pI
9fd0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70  node->pUnused; p
9fe0: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
9ff0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
a000: 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
a010: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
a020: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
a030: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
a040: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
a050: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
a060: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
a070: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
a080: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
a090: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
a0a0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
a0b0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
a0c0: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
a0d0: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
a0e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
a0f0: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
a100: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a110: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
a120: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a130: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
a140: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
a150: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
a160: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
a170: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
a180: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
a190: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
a1a0: 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49  Inode) ){.    pI
a1b0: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
a1c0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
a1d0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
a1e0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a1f0: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
a200: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
a210: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
a220: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
a230: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
a240: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a250: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
a260: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
a270: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
a280: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
a290: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
a2a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a2b0: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
a2c0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
a2d0: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
a2e0: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
a2f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
a300: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
a310: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
a320: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
a330: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
a340: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
a350: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
a360: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
a370: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a380: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
a390: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a3a0: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
a3b0: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
a3c0: 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  e the unixInodeI
a3d0: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
a3e0: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
a3f0: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
a400: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
a410: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
a420: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
a430: 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  n value might be
a440: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
a450: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
a460: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
a470: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
a480: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
a490: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
a4a0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
a4b0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a4c0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
a4d0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
a4e0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
a4f0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
a500: 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  nt findInodeInfo
a510: 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
a520: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
a530: 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20     /* Unix file 
a540: 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75  with file desc u
a550: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
a560: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
a570: 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20  o **ppInode     
a580: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
a590: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
a5a0: 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b  bject here */.){
a5b0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
a5e0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
a5f0: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
a620: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
a630: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
a640: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
a650: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20        /* Lookup 
a660: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
a670: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73  InodeInfo */.  s
a680: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
a690: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
a6a0: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
a6b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
a6c0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a6d0: 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  pInode = 0;     
a6e0: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
a6f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
a700: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
a710: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
a720: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  );..  /* Get low
a730: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
a740: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
a750: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
a760: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
a770: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
a780: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
a790: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
a7a0: 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  >h;.  rc = osFst
a7b0: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
a7c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
a7d0: 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
a7e0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
a7f0: 29 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  );.#ifdef EOVERF
a800: 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c  LOW.    if( pFil
a810: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
a820: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
a830: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
a840: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
a850: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
a860: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
a870: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
a880: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
a890: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
a8a0: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
a8b0: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
a8c0: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
a8d0: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
a8e0: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
a8f0: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
a900: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
a910: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
a920: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
a930: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
a940: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
a950: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
a960: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
a970: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
a980: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
a990: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
a9a0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
a9b0: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
a9c0: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
a9d0: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
a9e0: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
a9f0: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
aa00: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
aa10: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
aa20: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
aa30: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
aa40: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
aa50: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
aa60: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
aa70: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
aa80: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
aa90: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
aaa0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
aab0: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
aac0: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
aad0: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
aae0: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
aaf0: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
ab00: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
ab10: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
ab20: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69    do{ rc = osWri
ab30: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20  te(fd, "S", 1); 
ab40: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
ab50: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
ab60: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
ab70: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
ab80: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
ab90: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
aba0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
abb0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f      }.    rc = o
abc0: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
abd0: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
abe0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  !=0 ){.      sto
abf0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
ac00: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
ac10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
ac20: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
ac30: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
ac40: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
ac50: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
ac60: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
ac70: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
ac80: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
ac90: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
aca0: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
acb0: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74  ileId.ino = stat
acc0: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
acd0: 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  if.  pInode = in
ace0: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
acf0: 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63  ( pInode && memc
ad00: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e  mp(&fileId, &pIn
ad10: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  ode->fileId, siz
ad20: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
ad30: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
ad40: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ode->pNext;.  }.
ad50: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
ad60: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
ad70: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
ad80: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  ( sizeof(*pInode
ad90: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ) );.    if( pIn
ada0: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
adb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
adc0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
add0: 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c  emset(pInode, 0,
ade0: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
adf0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
ae00: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26  Inode->fileId, &
ae10: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
ae20: 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e  ileId));.    pIn
ae30: 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ode->nRef = 1;. 
ae40: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
ae50: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
ae60: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20    pInode->pPrev 
ae70: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f  = 0;.    if( ino
ae80: 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69  deList ) inodeLi
ae90: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  st->pPrev = pIno
aea0: 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73  de;.    inodeLis
aeb0: 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65  t = pInode;.  }e
aec0: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  lse{.    pInode-
aed0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
aee0: 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ppInode = pInode
aef0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
af00: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
af10: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 46  eturn TRUE if pF
af20: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e  ile has been ren
af30: 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64  amed or unlinked
af40: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 66 69   since it was fi
af50: 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  rst opened..*/.s
af60: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61  tatic int fileHa
af70: 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20  sMoved(unixFile 
af80: 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f  *pFile){.#if OS_
af90: 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e  VXWORKS.  return
afa0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d   pFile->pInode!=
afb0: 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21  0 && pFile->pId!
afc0: 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  =pFile->pInode->
afd0: 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73  fileId.pId;.#els
afe0: 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  e.  struct stat 
aff0: 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  buf;.  return pF
b000: 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26  ile->pInode!=0 &
b010: 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74 28  &.      (osStat(
b020: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62  pFile->zPath, &b
b030: 75 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74  uf)!=0 || buf.st
b040: 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  _ino!=pFile->pIn
b050: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29  ode->fileId.ino)
b060: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
b070: 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46  ** Check a unixF
b080: 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61  ile that is a da
b090: 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20  tabase.  Verify 
b0a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
b0b0: 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69  *.** (1) There i
b0c0: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61  s exactly one ha
b0d0: 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66  rd link on the f
b0e0: 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66  ile.** (2) The f
b0f0: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d  ile is not a sym
b100: 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33  bolic link.** (3
b110: 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e  ) The file has n
b120: 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20  ot been renamed 
b130: 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a  or unlinked.**.*
b140: 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f  * Issue sqlite3_
b150: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b160: 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73  NG,...) messages
b170: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20   if anything is 
b180: 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74  not right..*/.st
b190: 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79  atic void verify
b1a0: 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  DbFile(unixFile 
b1b0: 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63  *pFile){.  struc
b1c0: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e  t stat buf;.  in
b1d0: 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6f 73 46  t rc;.  rc = osF
b1e0: 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
b1f0: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
b200: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
b210: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
b220: 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74  ING, "cannot fst
b230: 61 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c 20  at db file %s", 
b240: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
b250: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b260: 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e   if( buf.st_nlin
b270: 6b 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e  k==0 && (pFile->
b280: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
b290: 46 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  FILE_DELETE)==0 
b2a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b2b0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b2c0: 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65  G, "file unlinke
b2d0: 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73  d while open: %s
b2e0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
b2f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b300: 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e  }.  if( buf.st_n
b310: 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71  link>1 ){.    sq
b320: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b330: 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69  _WARNING, "multi
b340: 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c  ple links to fil
b350: 65 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  e: %s", pFile->z
b360: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
b370: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c  n;.  }.  if( fil
b380: 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29  eHasMoved(pFile)
b390: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b3a0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b3b0: 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65  NG, "file rename
b3c0: 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73  d while open: %s
b3d0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
b3e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b3f0: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  }.}.../*.** This
b400: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
b410: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
b420: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
b430: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
b440: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
b450: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
b460: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
b470: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
b480: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
b490: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
b4a0: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
b4b0: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
b4c0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
b4d0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
b4e0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
b4f0: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
b500: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
b510: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
b520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
b530: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
b540: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
b550: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
b560: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
b570: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
b580: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
b590: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
b5a0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
b5b0: 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
b5c0: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
b5d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
b5e0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
b5f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
b600: 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  e );.  unixEnter
b610: 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
b620: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
b630: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
b640: 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20  ss threads */.. 
b650: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
b660: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
b670: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
b680: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
b690: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
b6a0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
b6b0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
b6c0: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  erved = 1;.  }..
b6d0: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
b6e0: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
b6f0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
b700: 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
b710: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20  __DJGPP__.  if( 
b720: 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70 46  !reserved && !pF
b730: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
b740: 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20  ocessLock ){.   
b750: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
b760: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
b770: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
b780: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
b790: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
b7a0: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
b7b0: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
b7c0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
b7d0: 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e  K;.    if( osFcn
b7e0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47  tl(pFile->h, F_G
b7f0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  ETLK, &lock) ){.
b800: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b810: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
b820: 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  ERVEDLOCK;.     
b830: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
b840: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
b850: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
b860: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
b870: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
b880: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
b890: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
b8a0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
b8b0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
b8c0: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
b8d0: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
b8e0: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
b8f0: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
b900: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
b910: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b920: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
b930: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
b940: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
b950: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
b960: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
b970: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
b980: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
b990: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
b9a0: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
b9b0: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
b9c0: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
b9d0: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
b9e0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
b9f0: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
ba00: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
ba10: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
ba20: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
ba30: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
ba40: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
ba50: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
ba60: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
ba70: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
ba80: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
ba90: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
baa0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
bab0: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
bac0: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
bad0: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
bae0: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
baf0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
bb00: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
bb10: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
bb20: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
bb30: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
bb40: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
bb50: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
bb60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
bb70: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
bb80: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
bb90: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
bba0: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
bbb0: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
bbc0: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
bbd0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
bbe0: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
bbf0: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
bc00: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
bc10: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
bc20: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
bc30: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
bc40: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
bc50: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
bc60: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
bc70: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
bc80: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
bc90: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
bca0: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
bcb0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
bcc0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
bcd0: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
bce0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
bcf0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
bd00: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
bd10: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
bd20: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
bd30: 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69  pInode!=0 );.  i
bd40: 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  f( ((pFile->ctrl
bd50: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
bd60: 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e  _EXCL)!=0 || pIn
bd70: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
bd80: 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65  k).   && ((pFile
bd90: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
bda0: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
bdb0: 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  0).  ){.    if( 
bdc0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
bdd0: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
bde0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
bdf0: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
be00: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
be10: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
be20: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
be30: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
be40: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
be50: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
be60: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
be70: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
be80: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
be90: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
bea0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
beb0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
bec0: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
bed0: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
bee0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
bef0: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
bf00: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
bf10: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
bf20: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
bf30: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
bf40: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
bf50: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
bf60: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  K, pLock);.  }. 
bf70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bf80: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
bf90: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
bfa0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
bfb0: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
bfc0: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
bfd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
bfe0: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
bff0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
c000: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
c010: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
c020: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
c030: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
c040: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
c050: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
c060: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
c070: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
c080: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
c090: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
c0a0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
c0b0: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
c0c0: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
c0d0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
c0e0: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
c0f0: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
c100: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
c110: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
c120: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
c130: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
c140: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
c150: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
c160: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
c170: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
c180: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
c190: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
c1a0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
c1b0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
c1c0: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
c1d0: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
c1e0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c1f0: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
c200: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
c210: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
c220: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
c230: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
c240: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
c250: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
c260: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
c270: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
c280: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
c290: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
c2a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
c2b0: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
c2c0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
c2d0: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
c2e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
c2f0: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
c300: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c310: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
c320: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
c330: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
c340: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
c350: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
c360: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
c370: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
c380: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
c390: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
c3a0: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
c3b0: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
c3c0: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
c3d0: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
c3e0: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
c3f0: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
c400: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
c410: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
c420: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
c430: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
c440: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
c450: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
c460: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
c470: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
c480: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
c490: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
c4a0: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
c4b0: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
c4c0: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
c4d0: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
c4e0: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
c4f0: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
c500: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
c510: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
c520: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
c530: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
c540: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
c550: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
c560: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
c570: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
c580: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
c590: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
c5a0: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
c5b0: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
c5c0: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
c5d0: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
c5e0: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
c5f0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
c600: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
c610: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
c620: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
c630: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
c640: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
c650: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
c660: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
c670: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
c680: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
c690: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
c6a0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
c6b0: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
c6c0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
c6d0: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
c6e0: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
c6f0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
c700: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
c710: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
c720: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
c730: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
c740: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
c750: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
c760: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
c770: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
c780: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
c790: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
c7a0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
c7b0: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
c7c0: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
c7d0: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
c7e0: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
c7f0: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
c800: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
c810: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
c820: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
c830: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
c840: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
c850: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
c860: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
c870: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
c880: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
c890: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
c8a0: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
c8b0: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
c8c0: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
c8d0: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
c8e0: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
c8f0: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
c900: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
c910: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
c920: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
c930: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
c940: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
c950: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
c960: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
c970: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
c980: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
c990: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
c9a0: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
c9b0: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
c9c0: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
c9d0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
c9e0: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
c9f0: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
ca00: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
ca10: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
ca20: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
ca30: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
ca40: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
ca50: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
ca60: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
ca70: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
ca80: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
ca90: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
caa0: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
cab0: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
cac0: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
cad0: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
cae0: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
caf0: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
cb00: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
cb10: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
cb20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
cb30: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
cb40: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
cb50: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
cb60: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
cb70: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
cb80: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
cb90: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
cba0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
cbb0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
cbc0: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
cbd0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
cbe0: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
cbf0: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
cc00: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
cc10: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
cc20: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
cc30: 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ck(pFile->pInode
cc40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46  ->eFileLock), pF
cc50: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
cc60: 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65  ared,.      osGe
cc70: 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a  tpid(0)));..  /*
cc80: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
cc90: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
cca0: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
ccb0: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
ccc0: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
ccd0: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
cce0: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
ccf0: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
cd00: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
cd10: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
cd20: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
cd30: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
cd40: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
cd50: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
cd60: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
cd70: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
cd80: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
cd90: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
cdb0: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
cdc0: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
cdd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
cde0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
cdf0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
ce00: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
ce10: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
ce20: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
ce30: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
ce40: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
ce50: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
ce60: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
ce70: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
ce80: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
ce90: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
cea0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
ceb0: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
cec0: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
ced0: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
cee0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
cef0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
cf00: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
cf10: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
cf20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
cf30: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
cf40: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
cf50: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
cf60: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
cf70: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
cf80: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
cf90: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
cfa0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
cfb0: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
cfc0: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
cfd0: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
cfe0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
cff0: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
d000: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
d010: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
d020: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
d030: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
d040: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
d050: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
d060: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
d070: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d080: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
d090: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
d0a0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
d0b0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d0c0: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
d0d0: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
d0e0: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
d0f0: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
d100: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
d110: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d120: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
d130: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
d140: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
d150: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
d160: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
d170: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
d180: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
d190: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
d1a0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
d1b0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
d1c0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
d1d0: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
d1e0: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
d1f0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
d200: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
d210: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
d220: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d230: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
d240: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
d250: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
d260: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d270: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d280: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d290: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d2a0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d2b0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
d2c0: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
d2d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
d2e0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
d2f0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
d300: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
d310: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
d320: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
d330: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
d340: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
d350: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
d360: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
d370: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
d380: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
d390: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
d3a0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
d3b0: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
d3c0: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
d3d0: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
d3e0: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
d3f0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d400: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
d410: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d420: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
d430: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
d440: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
d450: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
d460: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
d470: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d480: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
d490: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
d4a0: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
d4b0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
d4c0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
d4d0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
d4e0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
d4f0: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
d500: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d510: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d520: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d530: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d540: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
d550: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
d560: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
d570: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
d580: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
d590: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
d5a0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
d5b0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
d5c0: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
d5d0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
d5e0: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
d5f0: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
d600: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
d610: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
d620: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
d630: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
d640: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d650: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d660: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
d670: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d680: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
d690: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
d6a0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
d6b0: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  _OK );..    /* N
d6c0: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
d6d0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
d6e0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
d6f0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
d700: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
d710: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75  _SIZE;.    if( u
d720: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
d730: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
d740: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d750: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
d760: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d770: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d780: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
d790: 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  K);.    }..    /
d7a0: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
d7b0: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
d7c0: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
d7d0: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
d7e0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
d7f0: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
d800: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
d810: 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e  NLCK;.    if( un
d820: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
d830: 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d  , &lock) && rc==
d840: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d850: 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64     /* This could
d860: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e   happen with a n
d870: 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a  etwork mount */.
d880: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
d890: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
d8a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
d8b0: 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20  LOCK; .    }..  
d8c0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
d8d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d8e0: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
d8f0: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
d900: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
d910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
d920: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
d930: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
d940: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
d950: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
d960: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
d970: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
d980: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
d990: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
d9a0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
d9b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
d9c0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
d9d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
d9e0: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
d9f0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
da00: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
da10: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
da20: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
da30: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
da40: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
da50: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
da60: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
da70: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
da80: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
da90: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
daa0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
dab0: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
dac0: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
dad0: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
dae0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
daf0: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
db00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
db10: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
db20: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
db30: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
db40: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
db50: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
db60: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
db70: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
db80: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
db90: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
dba0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
dbb0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
dbc0: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
dbd0: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
dbe0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
dbf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
dc00: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
dc10: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
dc20: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
dc30: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
dc40: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
dc50: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
dc60: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
dc70: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
dc80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
dc90: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
dca0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
dcb0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
dcc0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
dcd0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
dce0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
dcf0: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
dd00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dd10: 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53    }.  ..#ifdef S
dd20: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
dd30: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
dd40: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
dd50: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
dd60: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
dd70: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
dd80: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
dd90: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
dda0: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
ddb0: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
ddc0: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
ddd0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
dde0: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
ddf0: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
de00: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
de10: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
de20: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
de30: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
de40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ->eFileLock<=SHA
de50: 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65  RED_LOCK.   && e
de60: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
de70: 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20  ED_LOCK.  ){.   
de80: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
de90: 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  rChng = 0;.    p
dea0: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
deb0: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   0;.    pFile->i
dec0: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31  nNormalWrite = 1
ded0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
dee0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
def0: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
df00: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
df10: 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
df20: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
df30: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
df40: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
df50: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
df60: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
df70: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
df80: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
df90: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
dfa0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
dfb0: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
dfc0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
dfd0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
dfe0: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
dff0: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e000: 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
e010: 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
e020: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
e030: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
e040: 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
e050: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
e060: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
e070: 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20  or used by file 
e080: 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20  handle pFile to 
e090: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
e0a0: 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73  g.** pUnused lis
e0b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
e0c0: 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75  d setPendingFd(u
e0d0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
e0e0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
e0f0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
e100: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
e110: 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46  UnusedFd *p = pF
e120: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ile->pUnused;.  
e130: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  p->pNext = pInod
e140: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49  e->pUnused;.  pI
e150: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
e160: 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  p;.  pFile->h = 
e170: 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e  -1;.  pFile->pUn
e180: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
e190: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
e1a0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
e1b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
e1c0: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
e1d0: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
e1e0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
e1f0: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
e200: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
e210: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e220: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
e230: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
e240: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
e250: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
e260: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
e270: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e280: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20  a no-op..** .** 
e290: 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  If handleNFSUnlo
e2a0: 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ck is true, then
e2b0: 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   on downgrading 
e2c0: 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  an EXCLUSIVE_LOC
e2d0: 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74  K to SHARED.** t
e2e0: 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73  he byte range is
e2f0: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20   divided into 2 
e300: 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69  parts and the fi
e310: 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f  rst part is unlo
e320: 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74  cked then.** set
e330: 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c   to a read lock,
e340: 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20   then the other 
e350: 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75  part is simply u
e360: 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77  nlocked.  This w
e370: 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20  orks .** around 
e380: 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53  a bug in BSD NFS
e390: 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65   lockd (also see
e3a0: 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33  n on MacOSX 10.3
e3b0: 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f  +) that fails to
e3c0: 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20   .** remove the 
e3d0: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20  write lock on a 
e3e0: 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65  region when a re
e3f0: 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a  ad lock is set..
e400: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
e410: 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  sixUnlock(sqlite
e420: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e430: 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68  eFileLock, int h
e440: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
e450: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e460: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e470: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
e480: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
e490: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
e4a0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
e4b0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
e4c0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
e4d0: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
e4e0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
e4f0: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
e500: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
e510: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
e520: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e530: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
e540: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
e550: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
e560: 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74  red,.      osGet
e570: 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73  pid(0)));..  ass
e580: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
e590: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e5a0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
e5b0: 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
e5c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e5d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e5e0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
e5f0: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
e600: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
e610: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
e620: 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
e630: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
e640: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
e650: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
e660: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
e670: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
e680: 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  k );..#ifdef SQL
e690: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
e6a0: 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
e6b0: 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
e6c0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
e6d0: 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
e6e0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
e6f0: 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
e700: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
e710: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
e720: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
e730: 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
e740: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
e750: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
e760: 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
e770: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e780: 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
e790: 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
e7a0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
e7b0: 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
e7c0: 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
e7d0: 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
e7e0: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
e7f0: 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
e800: 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
e810: 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
e820: 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
e830: 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
e840: 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
e850: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
e860: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
e870: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
e880: 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
e890: 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67  if..    /* downg
e8a0: 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72  rading to a shar
e8b0: 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69  ed lock on NFS i
e8c0: 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67  nvolves clearing
e8d0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a   the write lock.
e8e0: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73      ** before es
e8f0: 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72  tablishing the r
e900: 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f  eadlock - to avo
e910: 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  id a race condit
e920: 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65  ion we downgrade
e930: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
e940: 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f   in 2 blocks, so
e950: 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68   that part of th
e960: 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20  e range will be 
e970: 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20  covered by a .  
e980: 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20    ** write lock 
e990: 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69  until the rest i
e9a0: 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72  s covered by a r
e9b0: 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a  ead lock:.    **
e9c0: 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20    1:   [WWWWW]. 
e9d0: 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e     **  2:   [...
e9e0: 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20  .W].    **  3:  
e9f0: 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20   [RRRRW].    ** 
ea00: 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20   4:   [RRRR.].  
ea10: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69    */.    if( eFi
ea20: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
ea30: 4f 43 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69  OCK ){.#if !defi
ea40: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
ea50: 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
ea60: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
ea70: 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
ea80: 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
ea90: 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
eaa0: 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
eab0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
eac0: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
ead0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
eae0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
eaf0: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
eb00: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
eb10: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
eb30: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
eb40: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
eb50: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  s */.        off
eb60: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
eb70: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
eb80: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
eb90: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
eba0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
ebb0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ebc0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
ebd0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ebe0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ebf0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
ec00: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
ec10: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
ec20: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
ec30: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
ec40: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
ec50: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
ec60: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
ec70: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
ec80: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
ec90: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
eca0: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
ecb0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
ecc0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
ecd0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
ece0: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
ecf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ed00: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ed10: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  RDLCK;.        l
ed20: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
ed30: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
ed40: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
ed50: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
ed60: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
ed70: 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
ed80: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
ed90: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
eda0: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
edb0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
edc0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
edd0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
ede0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
edf0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
ee00: 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_RDLOCK);.   
ee10: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
ee20: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72              stor
ee40: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
ee50: 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
ee60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ee70: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
ee80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ee90: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
eea0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
eeb0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
eec0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
eed0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
eee0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
eef0: 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  +divSize;.      
ef00: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
ef10: 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69  HARED_SIZE-divSi
ef20: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
ef30: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
ef40: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
ef50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
ef60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
ef70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
ef80: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
ef90: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
efa0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
efb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
efc0: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
efd0: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
efe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
eff0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
f000: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
f010: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
f020: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
f030: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
f040: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
f050: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
f060: 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
f070: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
f080: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
f090: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f0a0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
f0b0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f0c0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
f0d0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
f0e0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
f0f0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
f100: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
f110: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
f120: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
f130: 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
f140: 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
f150: 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
f160: 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
f170: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
f180: 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
f190: 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
f1a0: 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
f1b0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
f1c0: 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
f1d0: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
f1e0: 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
f1f0: 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
f200: 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
f210: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
f220: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
f230: 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
f240: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
f250: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
f260: 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
f270: 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
f280: 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
f290: 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
f2a0: 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
f2b0: 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
f2c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f2d0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
f2e0: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
f2f0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
f300: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
f310: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
f320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f330: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
f340: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
f350: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
f360: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
f370: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
f380: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
f390: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
f3a0: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
f3b0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
f3c0: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
f3d0: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
f3e0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f3f0: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
f400: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
f410: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
f420: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f430: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
f440: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
f450: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f460: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
f470: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
f480: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  unlock;.    }.  
f490: 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  }.  if( eFileLoc
f4a0: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  k==NO_LOCK ){.  
f4b0: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
f4c0: 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
f4d0: 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
f4e0: 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
f4f0: 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
f500: 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
f510: 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
f520: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
f530: 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
f540: 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
f550: 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  */.    pInode->n
f560: 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
f570: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
f580: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f  d==0 ){.      lo
f590: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
f5a0: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
f5b0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f5c0: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
f5d0: 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c  l_start = lock.l
f5e0: 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20  _len = 0L;.     
f5f0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
f600: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
f610: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
f620: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
f630: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
f640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f650: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
f660: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
f670: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f680: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
f690: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
f6a0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
f6b0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
f6c0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
f6d0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
f6e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
f6f0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
f700: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
f710: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
f720: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
f730: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
f740: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
f750: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
f760: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
f770: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
f780: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
f790: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
f7a0: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
f7b0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
f7c0: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
f7d0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
f7e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
f7f0: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
f800: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
f810: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
f820: 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c    }.  }..end_unl
f830: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
f840: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
f850: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
f860: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
f870: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
f880: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f890: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
f8a0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
f8b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
f8c0: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
f8d0: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
f8e0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
f8f0: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
f900: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
f910: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
f920: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
f930: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
f940: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
f950: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
f960: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
f970: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f980: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
f990: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
f9a0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f9b0: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
f9c0: 6b 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  k){.#if SQLITE_M
f9d0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
f9e0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
f9f0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
fa00: 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29  || ((unixFile *)
fa10: 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  id)->nFetchOut==
fa20: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  0 );.#endif.  re
fa30: 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
fa40: 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
fa50: 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  0);.}..#if SQLIT
fa60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
fa70: 30 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  0.static int uni
fa80: 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  xMapfile(unixFil
fa90: 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74  e *pFd, i64 nByt
faa0: 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  e);.static void 
fab0: 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
fac0: 69 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65  ixFile *pFd);.#e
fad0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
fae0: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
faf0: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
fb00: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
fb10: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
fb20: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
fb30: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
fb40: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
fb50: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
fb60: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
fb70: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
fb80: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
fb90: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
fba0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
fbb0: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
fbc0: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
fbd0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
fbe0: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
fbf0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
fc00: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
fc10: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
fc20: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
fc30: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
fc40: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
fc50: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
fc60: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
fc70: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
fc80: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
fc90: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
fca0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
fcb0: 29 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  )id;.#if SQLITE_
fcc0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
fcd0: 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
fce0: 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pFile);.#endif. 
fcf0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
fd00: 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63   ){.    robust_c
fd10: 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c  lose(pFile, pFil
fd20: 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
fd30: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
fd40: 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56  -1;.  }.#if OS_V
fd50: 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69  XWORKS.  if( pFi
fd60: 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69  le->pId ){.    i
fd70: 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
fd80: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
fd90: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f  ELETE ){.      o
fda0: 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70  sUnlink(pFile->p
fdb0: 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
fdc0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  me);.    }.    v
fdd0: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
fde0: 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b  eId(pFile->pId);
fdf0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20  .    pFile->pId 
fe00: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
fe10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
fe20: 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45  LINK_AFTER_CLOSE
fe30: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74  .  if( pFile->ct
fe40: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
fe50: 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  LE_DELETE ){.   
fe60: 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d   osUnlink(pFile-
fe70: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  >zPath);.    sql
fe80: 69 74 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72  ite3_free(*(char
fe90: 2a 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68  **)&pFile->zPath
fea0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50  );.    pFile->zP
feb0: 61 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  ath = 0;.  }.#en
fec0: 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
fed0: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
fee0: 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f   pFile->h));.  O
fef0: 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
ff00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ff10: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
ff20: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
ff30: 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
ff40: 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
ff50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ff60: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
ff70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
ff80: 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
ff90: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
ffa0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ffb0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
ffc0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
ffd0: 2a 29 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62  *)id;.  verifyDb
ffe0: 46 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75  File(pFile);.  u
fff0: 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
10000 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
10010 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
10020 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
10030 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
10040 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
10050 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
10060 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
10070 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
10080 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
10090 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
100a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
100b0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
100c0 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
100d0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
100e0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Lock==0 );.  if(
100f0 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70   ALWAYS(pFile->p
10100 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d  Inode) && pFile-
10110 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
10120 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
10130 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
10140 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
10150 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
10160 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
10170 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
10180 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
10190 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
101a0 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
101b0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
101c0 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
101d0 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
101e0 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
101f0 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
10200 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
10210 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
10220 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
10230 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
10240 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
10250 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
10260 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c  File);.  rc = cl
10270 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
10280 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
10290 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
102a0 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
102b0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
102c0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
102d0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
102e0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
102f0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10340 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
10350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10390 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
103a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103b0 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
103c0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103e0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
103f0 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
10400 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
10410 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
10420 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
10430 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
10440 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
10450 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
10460 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
10470 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
10480 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
10490 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
104a0 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
104b0 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
104c0 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
104d0 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
104e0 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
104f0 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
10500 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
10510 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
10520 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
10530 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
10540 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
10550 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
10560 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
10570 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
10580 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
10590 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
105a0 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
105b0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
105c0 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
105d0 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
105e0 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
105f0 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
10600 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
10610 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
10620 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
10630 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
10640 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10650 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
10660 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
10670 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
10680 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
10690 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
106a0 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
106b0 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
106c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
106d0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
106e0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
106f0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
10700 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
10710 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
10720 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
10730 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
10740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
10750 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
10760 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10770 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
10780 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
10790 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
107a0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
107b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
107c0 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
107d0 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
107e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
107f0 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
10800 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
10810 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
10820 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
10830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10850 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
10860 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
10870 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
10880 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
10890 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
108a0 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
108b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
108c0 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
108d0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
108e0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
108f0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10940 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 2a 2a 2a 2a 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 0a 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 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
109c0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
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 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
109f0 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
10a00 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
10a10 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
10a20 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
10a30 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
10a40 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
10a50 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
10a60 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
10a70 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
10a80 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
10a90 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
10aa0 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
10ab0 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
10ac0 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
10ad0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
10ae0 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
10af0 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
10b00 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
10b10 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
10b20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
10b30 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
10b40 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
10b50 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
10b60 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
10b70 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
10b80 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
10b90 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
10ba0 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
10bb0 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
10bc0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
10bd0 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
10be0 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
10bf0 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
10c00 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
10c10 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
10c20 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
10c30 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
10c40 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
10c50 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
10c60 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
10c70 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
10c80 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
10c90 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
10ca0 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
10cb0 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
10cc0 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
10cd0 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
10ce0 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
10cf0 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
10d00 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
10d10 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
10d20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
10d30 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
10d40 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
10d50 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
10d60 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
10d70 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
10d80 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
10d90 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
10da0 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
10db0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
10dc0 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
10dd0 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
10de0 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
10df0 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
10e00 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
10e10 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
10e20 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
10e30 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
10e40 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
10e50 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
10e60 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
10e70 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
10e80 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
10e90 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
10ea0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
10eb0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
10ec0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
10ed0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
10ee0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
10ef0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
10f00 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
10f10 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
10f20 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
10f30 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
10f40 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
10f50 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
10f60 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
10f70 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
10f80 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
10f90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
10fa0 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
10fb0 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
10fc0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
10fd0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
10fe0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
10ff0 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
11000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11010 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
11020 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
11030 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
11040 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
11050 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11060 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
11070 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
11080 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11090 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
110a0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
110b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
110c0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
110d0 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
110e0 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
110f0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
11100 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
11110 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
11120 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
11130 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
11140 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11150 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
11160 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
11170 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
11180 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
11190 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
111a0 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
111b0 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
111c0 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
111d0 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
111e0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
111f0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
11200 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
11210 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
11220 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
11230 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11240 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
11250 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
11260 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
11270 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f      reserved = o
11280 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c  sAccess(zLockFil
11290 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
112a0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
112b0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
112c0 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
112d0 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
112e0 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
112f0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11300 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11310 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
11320 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
11330 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
11340 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
11350 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
11360 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
11370 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
11380 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
11390 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
113a0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
113b0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
113c0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
113d0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
113e0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
113f0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11400 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
11410 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
11420 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
11430 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
11440 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
11450 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
11460 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11470 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
11480 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
11490 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
114a0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
114b0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
114c0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
114d0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
114e0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
114f0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11500 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11510 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11520 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
11530 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
11540 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
11550 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
11560 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
11570 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11580 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11590 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
115a0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
115b0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
115c0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
115d0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
115e0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
115f0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
11600 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
11610 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
11620 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
11630 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
11640 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
11650 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
11660 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
11670 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
11680 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
11690 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
116a0 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
116b0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
116c0 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
116d0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
116e0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
116f0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11700 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11710 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
11720 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
11730 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
11740 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11750 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
11760 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
11770 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
11780 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
11790 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
117a0 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
117b0 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
117c0 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
117d0 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
117e0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
117f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
11800 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
11810 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
11820 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a  FileLock;.    /*
11830 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
11840 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
11850 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
11860 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
11870 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63  E.    utime(zLoc
11880 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
11890 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a  lse.    utimes(z
118a0 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
118b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
118c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
118d0 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
118e0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
118f0 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64   */.  rc = osMkd
11900 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37  ir(zLockFile, 07
11910 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  77);.  if( rc<0 
11920 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
11930 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
11940 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  the lock directo
11950 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45  ry */.    int tE
11960 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11970 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20    if( EEXIST == 
11980 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
11990 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
119a0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
119b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
119c0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
119d0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
119e0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
119f0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
11a00 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11a10 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
11a20 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
11a30 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
11a40 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
11a50 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20  c;.  } .  .  /* 
11a60 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
11a70 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
11a80 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
11a90 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
11aa0 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
11ab0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
11ac0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
11ad0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
11ae0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
11af0 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
11b00 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
11b10 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
11b20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
11b30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
11b40 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
11b50 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
11b60 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
11b70 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
11b80 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
11b90 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
11ba0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
11bb0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
11bc0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72   locking level r
11bd0 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20  eaches NO_LOCK, 
11be0 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
11bf0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
11c00 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  int dotlockUnloc
11c10 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11c20 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
11c30 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
11c40 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
11c50 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a  le*)id;.  char *
11c60 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
11c70 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
11c80 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
11c90 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
11ca0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
11cb0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
11cc0 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
11cd0 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
11ce0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
11cf0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
11d00 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
11d10 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
11d20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
11d30 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
11d40 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
11d50 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
11d60 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11d70 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
11d80 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
11d90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11da0 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
11db0 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
11dc0 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
11dd0 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
11de0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
11df0 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
11e00 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
11e10 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
11e20 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
11e30 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
11e40 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
11e50 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
11e60 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
11e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11e80 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
11e90 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
11ea0 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
11eb0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
11ec0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
11ed0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
11ee0 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28  .  rc = osRmdir(
11ef0 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66  zLockFile);.  if
11f00 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
11f10 3d 45 4e 4f 54 44 49 52 20 29 20 72 63 20 3d 20  =ENOTDIR ) rc = 
11f20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69  osUnlink(zLockFi
11f30 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
11f40 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  ){.    int tErrn
11f50 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
11f60 63 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 45  c = 0;.    if( E
11f70 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20  NOENT != tErrno 
11f80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11f90 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11fa0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
11fb0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
11fc0 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  c) ){.      stor
11fd0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
11fe0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
11ff0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
12000 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
12010 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
12020 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
12030 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12040 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
12050 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
12060 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
12070 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
12080 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
12090 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
120a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
120b0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
120c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
120d0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
120e0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
120f0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f  File*)id;.    do
12100 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  tlockUnlock(id, 
12110 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71  NO_LOCK);.    sq
12120 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
12130 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
12140 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73  );.    rc = clos
12150 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
12160 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12170 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
12180 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
12190 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69   dot-file lock i
121a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
121b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121c0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
121d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12210 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
12220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12260 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
12280 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e  gin flock Lockin
12290 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
122a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122b0 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  **.**.** Use the
122c0 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20   flock() system 
122d0 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20  call to do file 
122e0 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66  locking..**.** f
122f0 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69  lock() locking i
12300 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20  s like dot-file 
12310 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20  locking in that 
12320 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66  the various.** f
12330 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e  ine-grain lockin
12340 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74  g levels support
12350 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65  ed by SQLite are
12360 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a   collapsed into.
12370 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c  ** a single excl
12380 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20  usive lock.  In 
12390 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41  other words, SHA
123a0 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61  RED, RESERVED, a
123b0 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f  nd.** PENDING lo
123c0 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  cks are the same
123d0 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43   thing as an EXC
123e0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51  LUSIVE lock.  SQ
123f0 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f  Lite.** still wo
12400 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20  rks when you do 
12410 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72  this, but concur
12420 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64  rency is reduced
12430 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61   since.** only a
12440 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
12450 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74  can be reading t
12460 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61  he database at a
12470 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69   time..**.** Omi
12480 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69  t this section i
12490 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
124a0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
124b0 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23   turned off.*/.#
124c0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
124d0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a  _LOCKING_STYLE..
124e0 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63  /*.** Retry floc
124f0 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  k() calls that f
12500 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a  ail with EINTR.*
12510 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73  /.#ifdef EINTR.s
12520 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
12530 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69  _flock(int fd, i
12540 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63  nt op){.  int rc
12550 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f  ;.  do{ rc = flo
12560 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c  ck(fd,op); }whil
12570 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
12580 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
12590 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a  urn rc;.}.#else.
125a0 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f  # define robust_
125b0 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b  flock(a,b) flock
125c0 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20  (a,b).#endif.   
125d0 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72    ../*.** This r
125e0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
125f0 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
12600 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
12610 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
12620 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
12630 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
12640 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
12650 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
12660 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
12670 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
12680 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
12690 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
126a0 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
126b0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
126c0 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
126d0 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
126e0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
126f0 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
12700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
12710 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
12720 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12730 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
12740 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
12750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
12760 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
12770 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12780 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12790 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
127a0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
127b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
127c0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
127d0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
127e0 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  File );.  .  /* 
127f0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
12800 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
12810 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
12820 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
12830 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
12840 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
12850 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
12860 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
12870 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
12880 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
12890 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
128a0 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
128b0 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f     /* attempt to
128c0 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f   get the lock */
128d0 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72  .    int lrc = r
128e0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
128f0 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
12900 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66  LOCK_NB);.    if
12910 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  ( !lrc ){.      
12920 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c  /* got the lock,
12930 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20   unlock it */.  
12940 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74      lrc = robust
12950 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
12960 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
12970 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20   if ( lrc ) {.  
12980 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12990 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
129a0 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c    /* unlock fail
129b0 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
129c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20   */.        lrc 
129d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
129e0 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20 20  NLOCK; .        
129f0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12a00 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
12a10 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
12a20 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
12a30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
12a40 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
12a50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
12a60 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
12a70 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12a80 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
12a90 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
12aa0 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
12ab0 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
12ac0 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
12ad0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12ae0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
12af0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
12b00 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
12b10 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
12b20 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rc) ){.        s
12b30 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
12b40 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
12b50 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a        rc = lrc;.
12b60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12b70 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  }.  OSTRACE(("TE
12b80 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
12b90 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %d (flock)\n", 
12ba0 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
12bb0 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65  served));..#ifde
12bc0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
12bd0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12be0 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
12bf0 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
12c00 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
12c10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
12c20 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d  K;.    reserved=
12c30 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  1;.  }.#endif /*
12c40 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
12c50 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
12c60 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d   */.  *pResOut =
12c70 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
12c80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12c90 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
12ca0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
12cb0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
12cc0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
12cd0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
12ce0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
12cf0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
12d00 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
12d10 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
12d20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
12d30 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
12d40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
12d50 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
12d60 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
12d70 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
12d80 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
12d90 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
12da0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
12db0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
12dc0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
12dd0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
12de0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
12df0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
12e00 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
12e10 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
12e20 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
12e30 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
12e40 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
12e50 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
12e60 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
12e70 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
12e80 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
12e90 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
12ea0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
12eb0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
12ec0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
12ed0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
12ee0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
12ef0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
12f00 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
12f10 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
12f20 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
12f30 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12f40 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79  .** flock() only
12f50 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
12f60 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
12f70 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
12f80 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
12f90 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
12fa0 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
12fb0 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
12fc0 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
12fd0 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
12fe0 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
12ff0 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
13000 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
13010 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
13020 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
13030 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
13040 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
13050 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
13060 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
13070 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
13080 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
13090 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
130a0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b  ic int flockLock
130b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
130c0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
130d0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
130e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
130f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13100 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
13110 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13120 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
13130 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
13140 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
13150 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
13160 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
13170 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
13180 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
13190 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
131a0 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
131b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
131c0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
131d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
131e0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
131f0 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
13200 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66   lock */.  .  if
13210 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70   (robust_flock(p
13220 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
13230 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20   | LOCK_NB)) {. 
13240 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
13250 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69  errno;.    /* di
13260 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62  dn't get, must b
13270 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63  e busy */.    rc
13280 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
13290 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
132a0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
132b0 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  R_LOCK);.    if(
132c0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
132d0 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  c) ){.      stor
132e0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
132f0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
13300 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
13310 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
13320 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
13330 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69  rn ok */.    pFi
13340 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13350 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
13360 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
13370 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f     %d %s %s (flo
13380 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
13390 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
133a0 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
133b0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
133c0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
133d0 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53  led"));.#ifdef S
133e0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
133f0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
13400 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
13410 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
13420 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
13430 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
13440 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
13450 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
13460 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
13470 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
13480 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
13490 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
134a0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
134b0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
134c0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
134d0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
134e0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
134f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
13500 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
13510 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
13520 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
13530 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
13540 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
13550 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
13560 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
13570 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
13580 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
13590 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
135a0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
135b0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
135c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
135d0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
135e0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
135f0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
13600 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
13610 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
13620 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
13630 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
13640 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
13650 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
13660 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
13670 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
13680 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
13690 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
136a0 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
136b0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
136c0 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
136d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
136e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
136f0 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
13700 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
13710 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
13720 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
13730 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
13740 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
13750 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
13760 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
13770 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
13780 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13790 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
137a0 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
137b0 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  ( robust_flock(p
137c0 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
137d0 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
137e0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
137f0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
13800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13810 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
13820 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13830 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
13840 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13850 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
13860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
13870 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
13880 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
13890 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
138a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
138b0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
138c0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
138d0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
138e0 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
138f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
13900 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63  ( id ){.    floc
13910 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
13920 4f 43 4b 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  OCK);.    rc = c
13930 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
13940 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
13950 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
13960 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
13970 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
13980 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a  OS_VXWORK */../*
13990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139a0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c  ** End of the fl
139b0 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ock lock impleme
139c0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
139d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
139e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
13a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a90 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61  ******* Begin Na
13aa0 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f  med Semaphore Lo
13ab0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
13ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13ad0 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
13ae0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
13af0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
13b00 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
13b10 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   Semaphore locki
13b20 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c  ng is like dot-l
13b30 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e  ock and flock in
13b40 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20   that it really 
13b50 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73  only.** supports
13b60 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69   EXCLUSIVE locki
13b70 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67  ng.  Only a sing
13b80 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72  le process can r
13b90 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20  ead or write.** 
13ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13bb0 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  e at a time.  Th
13bc0 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e  is reduces poten
13bd0 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79  tial concurrency
13be0 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74  , but.** makes t
13bf0 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  he lock implemen
13c00 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69  tation much easi
13c10 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  er..*/.#if OS_VX
13c20 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  WORKS../*.** Thi
13c30 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
13c40 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
13c50 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
13c60 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
13c70 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
13c80 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
13c90 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
13ca0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
13cb0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
13cc0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
13cd0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
13ce0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
13cf0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
13d00 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
13d10 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
13d20 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
13d30 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
13d40 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
13d50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13d60 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65  semXCheckReserve
13d70 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
13d80 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
13d90 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
13da0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13db0 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
13dc0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
13dd0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13de0 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
13df0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
13e00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
13e10 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
13e20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
13e30 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
13e40 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
13e50 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
13e60 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
13e70 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
13e80 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
13e90 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
13ea0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
13eb0 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
13ec0 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
13ed0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
13ee0 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
13ef0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
13f00 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
13f10 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
13f20 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73 65  Sem;..    if( se
13f30 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
13f40 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =-1 ){.      int
13f50 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
13f60 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49  .      if( EAGAI
13f70 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  N != tErrno ){. 
13f80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13f90 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
13fa0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
13fb0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
13fc0 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
13fd0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
13fe0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
13ff0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  rno);.      } el
14000 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  se {.        /* 
14010 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73  someone else has
14020 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77   the lock when w
14030 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b  e are in NO_LOCK
14040 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
14050 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65  rved = (pFile->e
14060 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45  FileLock < SHARE
14070 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
14080 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14090 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61    /* we could ha
140a0 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74  ve it if we want
140b0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d   it */.      sem
140c0 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20  _post(pSem);.   
140d0 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
140e0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
140f0 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e  %d %d %d (sem)\n
14100 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
14110 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
14120 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
14130 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
14140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
14150 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
14160 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
14170 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
14180 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
14190 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
141a0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
141b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
141c0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
141d0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
141e0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
141f0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
14200 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
14210 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
14220 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
14230 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
14240 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
14250 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
14260 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
14270 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
14280 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
14290 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
142a0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
142b0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
142c0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
142d0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
142e0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
142f0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
14300 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
14310 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
14320 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
14330 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
14340 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
14350 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
14360 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
14370 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
14380 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
14390 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
143a0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
143b0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
143c0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
143d0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
143e0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
143f0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65  CLUSIVE.**.** Se
14400 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e  maphore locks on
14410 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
14420 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
14430 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
14440 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
14450 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
14460 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
14470 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
14480 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
14490 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
144a0 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
144b0 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
144c0 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
144d0 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
144e0 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
144f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14500 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
14510 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
14520 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
14530 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
14540 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
14550 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
14560 61 74 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f 63  atic int semXLoc
14570 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
14580 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
14590 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
145a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
145b0 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20  le*)id;.  sem_t 
145c0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
145d0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69  Inode->pSem;.  i
145e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
145f0 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  K;..  /* if we a
14600 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
14610 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
14620 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
14630 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
14640 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
14650 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
14660 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14670 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
14680 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14690 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
146a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
146b0 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  K;.    goto sem_
146c0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
146d0 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70  .  /* lock semap
146e0 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69  hore now but bai
146f0 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61  l out when alrea
14700 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  dy locked. */.  
14710 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
14720 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
14730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14740 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  Y;.    goto sem_
14750 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
14760 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
14770 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
14780 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
14790 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
147a0 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f  FileLock;.. sem_
147b0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75  end_lock:.  retu
147c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
147d0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
147e0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
147f0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
14800 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
14810 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
14820 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
14830 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
14840 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
14850 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14860 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
14870 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
14880 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
14890 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
148a0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
148b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
148c0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
148d0 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 73  int semXUnlock(s
148e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
148f0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
14900 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
14910 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14920 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53  )id;.  sem_t *pS
14930 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
14940 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73  de->pSem;..  ass
14950 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
14960 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a  assert( pSem );.
14970 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
14980 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
14990 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22   pid=%d (sem)\n"
149a0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
149b0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
149c0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
149d0 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  ck, osGetpid(0))
149e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
149f0 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
14a00 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
14a10 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
14a20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
14a30 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
14a40 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
14a50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14a60 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
14a70 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
14a80 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
14a90 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
14aa0 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65  usive */.  if (e
14ab0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
14ac0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
14ad0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
14ae0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
14af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14b00 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
14b10 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20   really unlock. 
14b20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f  */.  if ( sem_po
14b30 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b  st(pSem)==-1 ) {
14b40 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72  .    int rc, tEr
14b50 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
14b60 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
14b70 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
14b80 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
14b90 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
14ba0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
14bb0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
14bc0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
14bd0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
14be0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14bf0 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
14c00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
14c10 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
14c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14c30 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  *. ** Close a fi
14c40 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  le.. */.static i
14c50 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28 73 71 6c  nt semXClose(sql
14c60 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
14c70 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
14c80 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14c90 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14ca0 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63 6b  ;.    semXUnlock
14cb0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
14cc0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
14cd0 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   );.    unixEnte
14ce0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65  rMutex();.    re
14cf0 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
14d00 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c  File);.    unixL
14d10 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
14d20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
14d30 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
14d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
14d50 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
14d60 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d  RKS */./*.** Nam
14d70 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
14d80 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
14d90 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b  ilable on VxWork
14da0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
14db0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
14dc0 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
14dd0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
14de0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
14df0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
14e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e40 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
14e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e90 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
14ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14eb0 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f  *** Begin AFP Lo
14ec0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
14ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ee0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46  *******.**.** AF
14ef0 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46  P is the Apple F
14f00 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20  iling Protocol. 
14f10 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72   AFP is a networ
14f20 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75  k filesystem fou
14f30 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d  nd.** on Apple M
14f40 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65  acintosh compute
14f50 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e  rs - both OS9 an
14f60 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  d OSX..**.** Thi
14f70 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65  rd-party impleme
14f80 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20  ntations of AFP 
14f90 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  are available.  
14fa0 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65  But this code he
14fb0 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73  re.** only works
14fc0 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66   on OSX..*/..#if
14fd0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
14fe0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
14ff0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
15000 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70  LE./*.** The afp
15010 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
15020 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
15030 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
15040 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
15050 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
15060 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
15070 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
15080 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
15090 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
150a0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a    int reserved;.
150b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
150c0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
150d0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
150e0 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
150f0 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
15100 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
15110 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15120 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
15130 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
15140 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
15150 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
15160 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
15170 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
15180 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
15190 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
151a0 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
151b0 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
151c0 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
151d0 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
151e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
151f0 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
15200 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
15210 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
15220 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
15230 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
15240 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
15250 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
15260 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
15270 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
15280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15290 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
152a0 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
152b0 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
152c0 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
152d0 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
152e0 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
152f0 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
15300 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
15310 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
15320 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
15330 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
15340 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
15350 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
15360 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
15370 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
15380 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
15390 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
153a0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
153b0 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
153c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
153d0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
153e0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
153f0 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
15400 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
15410 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15420 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
15430 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
15440 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
15450 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
15460 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
15470 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
15480 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
15490 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
154a0 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
154b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
154c0 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
154d0 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
154e0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
154f0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
15500 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
15510 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
15520 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
15530 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
15540 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
15550 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
15560 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
15570 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
15580 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
15590 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
155a0 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
155b0 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
155c0 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
155d0 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46   .  OSTRACE(("AF
155e0 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
155f0 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
15600 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
15610 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
15620 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
15630 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
15640 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
15650 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
15660 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72   length));.  err
15670 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
15680 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
15690 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
156a0 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
156b0 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
156c0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
156d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
156e0 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
156f0 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
15700 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
15710 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15720 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74  path, tErrno, st
15730 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29  rerror(tErrno)))
15740 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
15750 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
15760 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
15770 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
15780 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
15790 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
157a0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157c0 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
157d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
157e0 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
157f0 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
15800 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
15810 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
15820 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
15830 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
15840 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
15850 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
15860 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
15870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
15880 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
15890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
158a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
158b0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
158c0 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
158d0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
158e0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
158f0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
15900 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
15910 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
15920 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
15930 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
15940 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
15950 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
15960 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
15970 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
15980 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
15990 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
159a0 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
159b0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
159c0 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
159d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
159e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
159f0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15a00 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
15a10 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15a20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
15a30 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
15a40 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15a50 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15a60 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
15a70 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
15a80 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
15a90 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
15aa0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
15ab0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
15ac0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
15ad0 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
15ae0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
15af0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
15b00 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
15b10 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
15b20 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
15b30 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
15b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15b50 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
15b60 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
15b70 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
15b80 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
15b90 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a  s threads */.  .
15ba0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
15bb0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
15bc0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
15bd0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
15be0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
15bf0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
15c00 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
15c10 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
15c20 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
15c30 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
15c40 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
15c50 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66  s it..   */.  if
15c60 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
15c70 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52     /* lock the R
15c80 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a  ESERVED byte */.
15c90 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66      int lrc = af
15ca0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
15cb0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
15cc0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
15cd0 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20  1,1);  .    if( 
15ce0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29  SQLITE_OK==lrc )
15cf0 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
15d00 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61   succeeded in ta
15d10 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65  king the reserve
15d20 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  d lock, unlock i
15d30 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20  t to restore.   
15d40 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
15d50 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  al state */.    
15d60 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f    lrc = afpSetLo
15d70 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
15d80 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
15d90 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
15da0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
15db0 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69      /* if we fai
15dc0 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c  led to get the l
15dd0 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65  ock then someone
15de0 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20   else must have 
15df0 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65  it */.      rese
15e00 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
15e10 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15e20 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
15e30 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20      rc=lrc;.    
15e40 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
15e50 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
15e60 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
15e70 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
15e80 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
15e90 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
15ea0 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74  );.  .  *pResOut
15eb0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
15ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15ed0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
15ee0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
15ef0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
15f00 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
15f10 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
15f20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
15f30 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
15f40 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
15f50 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
15f60 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
15f70 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
15f80 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
15f90 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
15fa0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
15fb0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
15fc0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
15fd0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
15fe0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
15ff0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
16000 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
16010 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
16020 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
16030 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
16040 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
16050 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
16060 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
16070 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
16080 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
16090 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
160a0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
160b0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
160c0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
160d0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
160e0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
160f0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
16100 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
16110 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
16120 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
16130 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
16140 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
16150 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
16160 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
16170 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
16180 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16190 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
161a0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
161b0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
161c0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
161d0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
161e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
161f0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c  .static int afpL
16200 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
16210 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
16220 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
16230 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
16240 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
16250 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
16260 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
16270 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
16280 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
16290 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
162a0 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
162b0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
162c0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
162d0 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  xt;.  .  assert(
162e0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
162f0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
16300 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
16310 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
16320 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
16330 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
16340 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
16350 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
16360 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
16370 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
16380 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
16390 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
163a0 53 68 61 72 65 64 20 2c 20 6f 73 47 65 74 70 69  Shared , osGetpi
163b0 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  d(0)));..  /* If
163c0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
163d0 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
163e0 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
163f0 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
16400 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
16410 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
16420 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e  t use the afp_en
16430 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
16440 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
16450 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
16460 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
16470 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
16480 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
16490 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
164a0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
164b0 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
164c0 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70  ready held) (afp
164d0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
164e0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
164f0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
16500 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
16510 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
16520 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
16530 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
16540 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
16550 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
16560 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
16570 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
16580 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
16590 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
165a0 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
165b0 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
165c0 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
165d0 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
165e0 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
165f0 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
16600 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
16610 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
16620 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
16630 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
16640 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
16650 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16660 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
16670 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
16680 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
16690 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
166a0 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
166b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
166c0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
166d0 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
166e0 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
166f0 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
16700 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
16710 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
16720 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16730 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
16740 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
16750 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
16760 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
16770 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
16780 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
16790 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
167a0 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
167b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
167c0 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
167d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
167e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
167f0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
16800 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49  k && .       (pI
16810 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
16820 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
16830 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
16840 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b  D_LOCK)).     ){
16850 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16860 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
16870 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
16880 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53  }.  .  /* If a S
16890 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
168a0 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
168b0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
168c0 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
168d0 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
168e0 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
168f0 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
16900 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
16910 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
16920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
16930 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
16940 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16950 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64   && .     (pInod
16960 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
16970 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
16980 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
16990 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
169a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
169b0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
169c0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
169d0 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
169e0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
169f0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
16a00 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
16a10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16a20 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
16a30 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
16a40 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
16a50 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
16a60 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
16a70 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
16a80 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
16a90 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
16aa0 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
16ab0 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
16ac0 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
16ad0 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
16ae0 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
16af0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
16b00 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
16b10 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
16b20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
16b30 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16b40 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
16b50 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
16b60 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
16b70 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
16b80 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
16b90 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20   int failed;.   
16ba0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
16bb0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
16bc0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
16bd0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29  DING_BYTE, 1, 1)
16be0 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64  ;.    if (failed
16bf0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ) {.      rc = f
16c00 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74  ailed;.      got
16c10 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16c20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
16c30 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
16c40 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
16c50 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
16c60 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
16c70 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
16c80 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
16c90 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
16ca0 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
16cb0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16cc0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
16cd0 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72  t lrc1, lrc2, lr
16ce0 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  c1Errno = 0;.   
16cf0 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a   long lk, mask;.
16d00 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28      .    assert(
16d10 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16d20 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
16d30 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
16d40 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
16d50 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28     .    mask = (
16d60 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29  sizeof(long)==8)
16d70 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   ? LARGEST_INT64
16d80 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   : 0x7fffffff;. 
16d90 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
16da0 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52  e read-lock SHAR
16db0 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f  ED_LOCK */.    /
16dc0 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * note that the 
16dd0 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72  quality of the r
16de0 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27  andomness doesn'
16df0 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75  t matter that mu
16e00 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72  ch */.    lk = r
16e10 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49  andom(); .    pI
16e20 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
16e30 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
16e40 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
16e50 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
16e60 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16e70 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16e80 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
16e90 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
16ea0 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
16eb0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
16ec0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
16ed0 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e  {.      lrc1Errn
16ee0 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  o = pFile->lastE
16ef0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
16f00 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
16f10 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
16f20 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d  ck */.    lrc2 =
16f30 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16f40 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16f50 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
16f60 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20  , 1, 0);.    .  
16f70 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
16f80 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20  ROR(lrc1) ) {.  
16f90 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
16fa0 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45 72  no(pFile, lrc1Er
16fb0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  rno);.      rc =
16fc0 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74   lrc1;.      got
16fd0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16fe0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49      } else if( I
16ff0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
17000 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  2) ){.      rc =
17010 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74   lrc2;.      got
17020 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
17030 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
17040 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  rc1 != SQLITE_OK
17050 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20   ) {.      rc = 
17060 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lrc1;.    } else
17070 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
17080 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
17090 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
170a0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
170b0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
170c0 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
170d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
170e0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
170f0 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
17100 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
17110 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
17120 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
17130 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
17140 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
17150 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d  this.     ** sam
17160 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
17170 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
17180 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
17190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
171a0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
171b0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
171c0 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
171d0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
171e0 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
171f0 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
17200 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
17210 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
17220 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
17230 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
17240 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69    */.    int fai
17250 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  led = 0;.    ass
17260 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
17270 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
17280 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d  if (eFileLock >=
17290 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
172a0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
172b0 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ck < RESERVED_LO
172c0 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK) {.        /*
172d0 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
172e0 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
172f0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
17300 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17310 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17320 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
17330 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ,1);.      if( !
17340 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
17350 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
17360 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ved = 1;.      }
17370 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
17380 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c  failed && eFileL
17390 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45  ock == EXCLUSIVE
173a0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f  _LOCK) {.      /
173b0 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
173c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20  LUSIVE lock */. 
173d0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
173e0 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72   Remove the shar
173f0 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74  ed lock before t
17400 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e  rying the range.
17410 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20    we'll need to 
17420 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61  .      ** reesta
17430 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
17440 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27   lock if we can'
17450 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e  t get the  afpUn
17460 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lock.      */.  
17470 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64      if( !(failed
17480 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17490 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
174a0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
174b0 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ST +.           
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
174d0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
174e0 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
174f0 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
17500 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
17510 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
17520 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
17530 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
17540 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
17550 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
17560 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17570 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
17580 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
17590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175a0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
175b0 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
175c0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
175d0 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
175e0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
175f0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
17600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17610 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
17620 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68  RST + pInode->sh
17630 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29  aredByte, 1, 1))
17640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
17650 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69   Can't reestabli
17660 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
17670 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27  ck.  Sqlite can'
17680 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a  t deal, this is.
17690 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63            ** a c
176a0 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f  ritical I/O erro
176b0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  r.          */. 
176c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28           rc = ((
176d0 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f  failed & SQLITE_
176e0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
176f0 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64  _IOERR) ? failed
17700 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 : .           
17710 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
17720 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  _LOCK;.         
17730 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
17740 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20  ck;.        } . 
17750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17760 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
17770 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
17780 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29      if( failed )
17790 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
177a0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  led;.    }.  }. 
177b0 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
177c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
177d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
177e0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
177f0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17800 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
17810 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
17820 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
17830 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
17840 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
17850 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
17860 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17870 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
17880 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64  ;.  }.  .afp_end
17890 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
178a0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
178b0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
178c0 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22  d %s %s (afp)\n"
178d0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
178e0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
178f0 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d  ), .         rc=
17900 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
17910 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
17920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17930 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
17940 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
17950 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17960 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
17970 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
17980 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
17990 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
179a0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
179b0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
179c0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
179d0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
179e0 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
179f0 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
17a00 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
17a10 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
17a20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
17a30 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c  tatic int afpUnl
17a40 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
17a50 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
17a60 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
17a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
17a80 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
17a90 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
17aa0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
17ab0 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  *pInode;.  afpLo
17ac0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
17ad0 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
17ae0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
17af0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
17b00 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53  ext;.  int skipS
17b10 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  hared = 0;.#ifde
17b20 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
17b30 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68  int h = pFile->h
17b40 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
17b50 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
17b60 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
17b70 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
17b80 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
17b90 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
17ba0 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
17bb0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
17bc0 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
17bd0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17be0 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
17bf0 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
17c00 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29       osGetpid(0)
17c10 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
17c20 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
17c30 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
17c40 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
17c50 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
17c60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17c70 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
17c80 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
17c90 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
17ca0 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
17cb0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
17cc0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
17cd0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
17ce0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
17cf0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17d00 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
17d10 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
17d20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
17d30 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
17d40 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17d50 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
17d60 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
17d70 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
17d80 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
17d90 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
17da0 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
17db0 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
17dc0 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
17dd0 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
17de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17df0 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
17e00 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
17e10 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
17e20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
17e30 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
17e40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
17e50 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
17e60 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
17e70 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
17e80 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
17e90 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
17ea0 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
17eb0 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
17ec0 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
17ed0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
17ee0 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
17ef0 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
17f00 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
17f10 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
17f20 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
17f30 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
17f40 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
17f50 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
17f60 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
17f70 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
17f80 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
17f90 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
17fa0 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
17fb0 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
17fc0 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31  transCntrChng==1
17fd0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   );.    pFile->i
17fe0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
17ff0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
18000 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
18010 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
18020 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
18030 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18040 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18050 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
18060 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
18070 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  E, 0);.      if(
18080 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
18090 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
180a0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
180b0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20  ode->nShared>1) 
180c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e  ){.        /* on
180d0 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  ly re-establish 
180e0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
180f0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
18100 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72          int shar
18110 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
18120 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
18130 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
18140 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18150 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18160 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
18170 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
18180 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73   1);.      } els
18190 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70  e {.        skip
181a0 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
181b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
181c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
181d0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
181e0 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
181f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18200 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18210 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18220 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
18230 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20   1, 0);.    } . 
18240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18250 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
18260 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  FileLock>=RESERV
18270 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65  ED_LOCK && conte
18280 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
18290 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
182a0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
182b0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
182c0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
182d0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  0);.      if( !r
182e0 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f  c ){ .        co
182f0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
18300 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  = 0; .      }.  
18310 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
18320 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
18330 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18340 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
18350 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20  nShared>1)){.   
18360 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
18370 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
18380 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  CK;.    }.  }.  
18390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
183a0 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K && eFileLock==
183b0 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20  NO_LOCK ){..    
183c0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
183d0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
183e0 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
183f0 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
18400 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
18410 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
18420 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
18430 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
18440 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
18450 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
18460 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
18470 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f  ng long sharedLo
18480 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
18490 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
184a0 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49  aredByte;.    pI
184b0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
184c0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
184d0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
184e0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
184f0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
18500 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18510 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
18520 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18530 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
18540 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68       if( !skipSh
18550 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ared ){.        
18560 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18570 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18580 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
18590 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20  ckByte, 1, 0);. 
185a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
185b0 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
185c0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
185d0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
185e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
185f0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
18600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18610 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49  E_OK ){.      pI
18630 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
18640 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
18650 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
18660 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
18670 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
18680 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64         closePend
18690 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
186a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
186b0 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
186c0 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
186d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
186e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
186f0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
18700 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18710 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
18720 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
18730 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
18740 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63  ntext .*/.static
18750 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71   int afpClose(sq
18760 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
18770 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18780 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64  ITE_OK;.  if( id
18790 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
187a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
187b0 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70  ile*)id;.    afp
187c0 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
187d0 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  CK);.    unixEnt
187e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69  erMutex();.    i
187f0 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
18800 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   && pFile->pInod
18810 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
18820 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
18830 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
18840 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
18850 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
18860 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
18870 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
18880 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
18890 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
188a0 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
188b0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
188c0 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
188d0 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
188e0 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
188f0 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
18900 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  n.      ** the l
18910 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
18920 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
18930 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64      setPendingFd
18940 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
18950 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49     releaseInodeI
18960 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nfo(pFile);.    
18970 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
18980 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
18990 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  xt);.    rc = cl
189a0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
189b0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
189c0 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tex();.  }.  ret
189d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
189e0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
189f0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
18a00 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
18a10 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
18a20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
18a30 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  s the AFP lock i
18a40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
18a50 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
18a60 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
18a70 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
18a80 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
18a90 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
18aa0 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
18ab0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49  is available.  I
18ac0 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70  f you don't comp
18ad0 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74  ile for a mac, t
18ae0 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66  hen the "unix-af
18af0 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74  p".** VFS is not
18b00 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
18b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b20 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
18b30 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
18b40 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
18b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
18bb0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
18bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
18c20 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n NFS Locking **
18c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
18c50 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
18c60 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
18c70 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
18c80 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f  _STYLE./*. ** Lo
18c90 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
18ca0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
18cb0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
18cc0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
18cd0 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74  ileLock. ** must
18ce0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
18cf0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
18d00 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68  K.. **. ** If th
18d10 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
18d20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
18d30 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
18d40 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a  y at or below. *
18d50 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
18d60 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
18d70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18d80 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74   no-op.. */.stat
18d90 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b  ic int nfsUnlock
18da0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
18db0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
18dc0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  ){.  return posi
18dd0 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
18de0 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65  eLock, 1);.}..#e
18df0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
18e00 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
18e10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
18e20 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
18e30 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
18e40 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63  e is the NFS loc
18e50 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
18e60 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
18e70 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
18e80 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
18e90 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
18ea0 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
18eb0 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
18ec0 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
18ed0 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    .**.**********
18ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
18ef0 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  of the NFS lock 
18f00 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
18f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f20 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
18f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f70 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
18f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fc0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
18fd0 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b  ******* Non-lock
18fe0 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ing sqlite3_file
18ff0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
19000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19010 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
19020 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63   next division c
19030 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e  ontains implemen
19040 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20  tations for all 
19050 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a  methods of the .
19060 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
19070 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61  object other tha
19080 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  n the locking me
19090 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b  thods.  The lock
190a0 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77  ing.** methods w
190b0 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64  ere defined in d
190c0 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28  ivisions above (
190d0 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  one locking meth
190e0 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69  od per.** divisi
190f0 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68  on).  Those meth
19100 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ods that are com
19110 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
19120 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20  ng modes.** are 
19130 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20  gather together 
19140 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69  into this divisi
19150 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  on..*/../*.** Se
19160 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
19170 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
19180 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
19190 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a  then read cnt .*
191a0 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  * bytes into pBu
191b0 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  f. Return the nu
191c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
191d0 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a  tually read..**.
191e0 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64  ** NB:  If you d
191f0 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20  efine USE_PREAD 
19200 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20  or USE_PREAD64, 
19210 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c  then it might al
19220 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  so.** be necessa
19230 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  ry to define _XO
19240 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65  PEN_SOURCE to be
19250 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69   500.  This vari
19260 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73  es from.** one s
19270 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72  ystem to another
19280 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20  .  Since SQLite 
19290 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20  does not define 
192a0 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20  USE_PREAD.** in 
192b0 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61  any form by defa
192c0 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74  ult, we will not
192d0 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69   attempt to defi
192e0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
192f0 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73  ..** See tickets
19300 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31   #2741 and #2681
19310 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
19320 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
19330 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
19340 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c  ailed read the l
19350 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
19360 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
19370 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
19380 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
19390 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
193a0 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
193b0 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
193c0 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
193d0 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20   int got;.  int 
193e0 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28  prior = 0;.#if (
193f0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
19400 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
19410 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
19420 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
19430 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
19440 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ART;.  assert( c
19450 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66  nt==(cnt&0x1ffff
19460 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
19470 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a  d->h>2 );.  do{.
19480 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
19490 50 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d  PREAD).    got =
194a0 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20   osPread(id->h, 
194b0 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
194c0 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  t);.    Simulate
194d0 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
194e0 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
194f0 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
19500 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61      got = osPrea
19510 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
19520 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
19530 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19540 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
19550 23 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66  #else.    newOff
19560 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
19570 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
19580 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
19590 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
195a0 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66  fset-- );.    if
195b0 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
195c0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  set ){.      if(
195d0 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
195e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
195f0 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78  eLastErrno((unix
19600 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29  File*)id, errno)
19610 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19620 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
19630 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a  Errno((unixFile*
19640 29 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  )id, 0);.      }
19650 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
19660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20  ;.    }.    got 
19670 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20  = osRead(id->h, 
19680 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
19690 69 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d  if.    if( got==
196a0 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  cnt ) break;.   
196b0 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
196c0 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45      if( errno==E
196d0 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b  INTR ){ got = 1;
196e0 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20   continue; }.   
196f0 20 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20     prior = 0;.  
19700 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
19710 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  no((unixFile*)id
19720 2c 20 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  ,  errno);.     
19730 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
19740 65 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20  e if( got>0 ){. 
19750 20 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b       cnt -= got;
19760 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
19770 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f   got;.      prio
19780 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  r += got;.      
19790 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67  pBuf = (void*)(g
197a0 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66  ot + (char*)pBuf
197b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
197c0 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49  e( got>0 );.  TI
197d0 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41  MER_END;.  OSTRA
197e0 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33  CE(("READ    %-3
197f0 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
19800 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
19810 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f   id->h, got+prio
19820 72 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c  r, offset-prior,
19830 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
19840 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70  ;.  return got+p
19850 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rior;.}../*.** R
19860 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
19870 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
19880 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
19890 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
198a0 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
198b0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
198c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
198d0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
198e0 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
198f0 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28  ic int unixRead(
19900 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
19910 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42  *id, .  void *pB
19920 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
19930 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
19940 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78  offset.){.  unix
19950 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
19960 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
19970 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  int got;.  asser
19980 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
19990 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
199a0 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
199b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
199c0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
199d0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
199e0 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
199f0 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
19a00 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
19a10 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
19a20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
19a30 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
19a40 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
19a50 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
19a60 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
19a70 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
19a80 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
19a90 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
19aa0 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
19ab0 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
19ac0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
19ad0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
19ae0 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
19af0 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72  h of this read r
19b00 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
19b10 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
19b20 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
19b30 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
19b40 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
19b50 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
19b60 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
19b70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
19b80 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
19b90 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
19ba0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
19bb0 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
19bc0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
19bd0 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a  [offset], amt);.
19be0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19bf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
19c00 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
19c10 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  py = pFile->mmap
19c20 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
19c30 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
19c40 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
19c50 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
19c60 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
19c70 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
19c80 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
19c90 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
19ca0 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
19cb0 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
19cc0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
19cd0 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
19ce0 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
19cf0 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
19d00 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
19d10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19d20 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
19d30 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
19d40 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
19d50 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
19d60 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
19d70 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
19d80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
19d90 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
19da0 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74  le, 0);   /* not
19db0 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20   a system error 
19dc0 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  */.    /* Unread
19dd0 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
19de0 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
19df0 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
19e00 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
19e10 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
19e20 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
19e30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
19e40 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
19e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
19e60 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69  t to seek the fi
19e70 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61  le-descriptor pa
19e80 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
19e90 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a  t argument to.**
19ea0 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74   absolute offset
19eb0 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65   iOff, then atte
19ec0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75  mpt to write nBu
19ed0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
19ee0 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20  from.** pBuf to 
19ef0 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  it. If an error 
19f00 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d  occurs, return -
19f10 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72  1 and set *piErr
19f20 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  no. Otherwise, .
19f30 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63  ** return the ac
19f40 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  tual number of b
19f50 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68  ytes written (wh
19f60 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20  ich may be less 
19f70 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a  than.** nBuf)..*
19f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
19f90 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69  kAndWriteFd(.  i
19fa0 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20  nt fd,          
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19fc0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
19fd0 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
19fe0 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20  .  i64 iOff,    
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a000 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65     /* File offse
1a010 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  t to begin writi
1a020 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ng at */.  const
1a030 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1a040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1a050 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  py data from thi
1a060 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20  s buffer to the 
1a070 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  file */.  int nB
1a080 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1a090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1a0a0 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66  e of buffer pBuf
1a0b0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1a0c0 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20  nt *piErrno     
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a0e0 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d  * OUT: Error num
1a0f0 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63  ber if error occ
1a100 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  urs */.){.  int 
1a110 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1a120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1a130 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1a140 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
1a150 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d  .  assert( nBuf=
1a160 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20  =(nBuf&0x1ffff) 
1a170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e  );.  assert( fd>
1a180 32 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30  2 );.  nBuf &= 0
1a190 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f  x1ffff;.  TIMER_
1a1a0 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69  START;..#if defi
1a1b0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
1a1c0 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f   do{ rc = (int)o
1a1d0 73 50 77 72 69 74 65 28 66 64 2c 20 70 42 75 66  sPwrite(fd, pBuf
1a1e0 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d  , nBuf, iOff); }
1a1f0 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
1a200 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
1a210 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
1a220 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
1a230 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69  rc = (int)osPwri
1a240 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e  te64(fd, pBuf, n
1a250 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c  Buf, iOff);}whil
1a260 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
1a270 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a  ==EINTR);.#else.
1a280 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53    do{.    i64 iS
1a290 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20  eek = lseek(fd, 
1a2a0 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b  iOff, SEEK_SET);
1a2b0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
1a2c0 72 72 6f 72 28 20 69 53 65 65 6b 2d 2d 20 29 3b  rror( iSeek-- );
1a2d0 0a 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b 21  ..    if( iSeek!
1a2e0 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 69  =iOff ){.      i
1a2f0 66 28 20 70 69 45 72 72 6e 6f 20 29 20 2a 70 69  f( piErrno ) *pi
1a300 45 72 72 6e 6f 20 3d 20 28 69 53 65 65 6b 3d 3d  Errno = (iSeek==
1a310 2d 31 20 3f 20 65 72 72 6e 6f 20 3a 20 30 29 3b  -1 ? errno : 0);
1a320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1a330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1a340 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42 75   osWrite(fd, pBu
1a350 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69  f, nBuf);.  }whi
1a360 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1a370 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64  o==EINTR );.#end
1a380 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  if..  TIMER_END;
1a390 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
1a3a0 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  TE   %-3d %5d %7
1a3b0 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c  lld %llu\n", fd,
1a3c0 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52   rc, iOff, TIMER
1a3d0 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20 69  _ELAPSED));..  i
1a3e0 66 28 20 72 63 3c 30 20 26 26 20 70 69 45 72 72  f( rc<0 && piErr
1a3f0 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20  no ) *piErrno = 
1a400 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  errno;.  return 
1a410 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65  rc;.}.../*.** Se
1a420 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
1a430 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
1a440 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
1a450 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
1a460 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1a470 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1a480 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
1a490 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
1a4a0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
1a4b0 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
1a4c0 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
1a4d0 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73  ed write the las
1a4e0 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
1a4f0 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
1a500 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1a510 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
1a520 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ite(unixFile *id
1a530 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f  , i64 offset, co
1a540 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
1a550 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75  int cnt){.  retu
1a560 72 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  rn seekAndWriteF
1a570 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  d(id->h, offset,
1a580 20 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d   pBuf, cnt, &id-
1a590 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a  >lastErrno);.}..
1a5a0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
1a5b0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
1a5c0 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
1a5d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1a5e0 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
1a5f0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1a600 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
1a610 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a620 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c  unixWrite(.  sql
1a630 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
1a640 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
1a650 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
1a660 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1a670 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69  offset .){.  uni
1a680 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1a690 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1a6a0 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20  int wrote = 0;. 
1a6b0 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
1a6c0 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
1a6d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1a6e0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
1a6f0 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
1a700 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
1a710 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
1a720 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
1a730 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
1a740 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
1a750 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
1a760 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
1a770 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
1a780 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  pUnused==0.     
1a790 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
1a7a0 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
1a7b0 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
1a7c0 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
1a7d0 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   .  );.#endif..#
1a7e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1a7f0 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  UG.  /* If we ar
1a800 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1a810 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1a820 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1a830 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f  posed to.  ** do
1a840 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1a850 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1a860 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1a870 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1a880 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61    ** normal data
1a890 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20  base file) then 
1a8a0 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
1a8b0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1a8c0 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67  e.  ** has chang
1a8d0 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
1a8e0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1a8f0 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63  is modified, rec
1a900 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61  ord that.  ** fa
1a910 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ct too..  */.  i
1a920 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
1a930 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70  alWrite ){.    p
1a940 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
1a950 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61   1;  /* The data
1a960 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
1a970 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66  dified */.    if
1a980 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20  ( offset<=24 && 
1a990 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29  offset+amt>=27 )
1a9a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1a9b0 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e        char oldCn
1a9c0 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d  tr[4];.      Sim
1a9d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1a9e0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1a9f0 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
1aa00 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72  ile, 24, oldCntr
1aa10 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  , 4);.      Simu
1aa20 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1aa30 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
1aa40 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28  rc!=4 || memcmp(
1aa50 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72  oldCntr, &((char
1aa60 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65  *)pBuf)[24-offse
1aa70 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20  t], 4)!=0 ){.   
1aa80 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e       pFile->tran
1aa90 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20  sCntrChng = 1;  
1aaa0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
1aab0 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63  on counter has c
1aac0 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20  hanged */.      
1aad0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1aae0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
1aaf0 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44  SQLITE_MMAP_READ
1ab00 57 52 49 54 45 29 20 26 26 20 53 51 4c 49 54 45  WRITE) && SQLITE
1ab10 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1ab20 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
1ab30 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
1ab40 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73  write request as
1ab50 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
1ab60 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
1ab70 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
1ab80 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
1ab90 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
1aba0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
1abb0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1abc0 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
1abd0 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
1abe0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
1abf0 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
1ac00 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1ac10 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
1ac20 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
1ac30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ac40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ac50 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c  int nCopy = pFil
1ac60 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
1ac70 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63  fset;.      memc
1ac80 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
1ac90 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1aca0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e  offset], pBuf, n
1acb0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
1acc0 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
1acd0 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
1ace0 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
1acf0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
1ad00 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
1ad10 65 6e 64 69 66 0a 20 0a 20 20 77 68 69 6c 65 28  endif. .  while(
1ad20 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e   (wrote = seekAn
1ad30 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66  dWrite(pFile, of
1ad40 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
1ad50 29 3c 61 6d 74 20 26 26 20 77 72 6f 74 65 3e 30  )<amt && wrote>0
1ad60 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
1ad70 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74  rote;.    offset
1ad80 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   += wrote;.    p
1ad90 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
1ada0 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
1adb0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1adc0 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c  or(( wrote=(-1),
1add0 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d   amt=1 ));.  Sim
1ade0 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
1adf0 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d  or(( wrote=0, am
1ae00 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61  t=1 ));..  if( a
1ae10 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20 20 20 20  mt>wrote ){.    
1ae20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70  if( wrote<0 && p
1ae30 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21  File->lastErrno!
1ae40 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20  =ENOSPC ){.     
1ae50 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1ae60 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  t by seekAndWrit
1ae70 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
1ae80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1ae90 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
1aea0 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
1aeb0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b  Errno(pFile, 0);
1aec0 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
1aed0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
1aee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1aef0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LL;.    }.  }.. 
1af00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1af10 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
1af20 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
1af30 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1af40 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
1af50 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
1af60 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
1af70 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
1af80 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
1af90 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61   are occurring a
1afa0 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
1afb0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1afc0 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
1afd0 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
1afe0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
1aff0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1b000 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20  We do not trust 
1b010 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69  systems to provi
1b020 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61  de a working fda
1b030 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20  tasync().  Some 
1b040 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f  do..** Others do
1b050 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65   no.  To be safe
1b060 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20  , we will stick 
1b070 77 69 74 68 20 74 68 65 20 28 73 6c 69 67 68 74  with the (slight
1b080 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73  ly slower).** fs
1b090 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e  ync(). If you kn
1b0a0 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73 79 73  ow that your sys
1b0b0 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74  tem does support
1b0c0 20 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72   fdatasync() cor
1b0d0 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20  rectly,.** then 
1b0e0 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77  simply compile w
1b0f0 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d  ith -Dfdatasync=
1b100 66 64 61 74 61 73 79 6e 63 20 6f 72 20 2d 44 48  fdatasync or -DH
1b110 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 2a 2f  AVE_FDATASYNC.*/
1b120 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 64  .#if !defined(fd
1b130 61 74 61 73 79 6e 63 29 20 26 26 20 21 48 41 56  atasync) && !HAV
1b140 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65  E_FDATASYNC.# de
1b150 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
1b160 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
1b170 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
1b180 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
1b190 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
1b1a0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
1b1b0 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
1b1c0 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
1b1d0 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
1b1e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1b1f0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
1b200 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
1b210 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
1b220 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
1b230 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
1b240 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1b250 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
1b260 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1b270 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
1b280 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
1b290 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
1b2a0 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
1b2b0 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
1b2c0 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
1b2d0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1b2e0 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
1b2f0 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
1b300 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
1b310 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
1b320 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
1b330 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
1b340 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
1b350 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
1b360 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
1b370 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
1b380 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
1b390 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
1b3a0 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
1b3b0 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
1b3c0 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
1b3d0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
1b3e0 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
1b3f0 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
1b400 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
1b410 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
1b420 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
1b430 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
1b440 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
1b450 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1b460 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65   SQLite sets the
1b470 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69   dataOnly flag i
1b480 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
1b490 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e  e file is unchan
1b4a0 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61  ged..** The idea
1b4b0 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79   behind dataOnly
1b4c0 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75   is that it shou
1b4d0 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  ld only write th
1b4e0 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a  e file content.*
1b4f0 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74  * to disk, not t
1b500 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e  he inode.  We on
1b510 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20  ly set dataOnly 
1b520 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  if the file size
1b530 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65   is .** unchange
1b540 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65  d since the file
1b550 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66   size is part of
1b560 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77   the inode.  How
1b570 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73  ever, .** Ted Ts
1b580 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74  'o tells us that
1b590 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1b5a0 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  l also write the
1b5b0 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a   inode if the.**
1b5c0 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63   file size has c
1b5d0 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c  hanged.  The onl
1b5e0 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63  y real differenc
1b5f0 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73  e between fdatas
1b600 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79  ync().** and fsy
1b610 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20  nc(), Ted tells 
1b620 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74  us, is that fdat
1b630 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74  async() will not
1b640 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e   flush the.** in
1b650 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65  ode if the mtime
1b660 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68   or owner or oth
1b670 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75  er inode attribu
1b680 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  tes have changed
1b690 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72  ..** We only car
1b6a0 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  e about the file
1b6b0 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f   size, not the o
1b6c0 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62  ther file attrib
1b6d0 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66  utes, so.** as f
1b6e0 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20  ar as SQLite is 
1b6f0 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64  concerned, an fd
1b700 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77  atasync() is alw
1b710 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a  ays adequate..**
1b720 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75   So, we always u
1b730 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  se fdatasync() i
1b740 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
1b750 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1b760 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1b770 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1b780 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
1b790 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
1b7a0 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
1b7b0 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
1b7c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
1b7d0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1b7e0 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65  "ifdef/elif/else
1b7f0 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65  /" block has the
1b800 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20   same structure 
1b810 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20  as.  ** the one 
1b820 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70  below. It is rep
1b830 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c  licated here sol
1b840 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75  ely to avoid clu
1b850 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70  ttering .  ** up
1b860 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77   the real code w
1b870 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50  ith the UNUSED_P
1b880 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f  ARAMETER() macro
1b890 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
1b8a0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1b8b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b8c0 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
1b8d0 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1b8e0 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1b8f0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1b900 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
1b910 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  LFSYNC.  UNUSED_
1b920 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1b930 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ly);.#else.  UNU
1b940 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1b950 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1b960 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1b970 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Only);.#endif.. 
1b980 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
1b990 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
1b9a0 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
1b9b0 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
1b9c0 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
1b9d0 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
1b9e0 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
1b9f0 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1ba00 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
1ba10 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
1ba20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
1ba30 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
1ba40 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1ba50 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
1ba60 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1ba70 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
1ba80 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
1ba90 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1baa0 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
1bab0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
1bac0 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
1bad0 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
1bae0 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
1baf0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1bb00 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  YNC.  rc = SQLIT
1bb10 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45  E_OK;.#elif HAVE
1bb20 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
1bb30 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20   fullSync ){.   
1bb40 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64   rc = osFcntl(fd
1bb50 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
1bb60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1bb70 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
1bb80 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
1bb90 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
1bba0 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
1bbb0 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
1bbc0 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20  ** It shouldn't 
1bbd0 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
1bbe0 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
1bbf0 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
1bc00 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d    ** file system
1bc10 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
1bc20 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
1bc30 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
1bc40 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72   ** isn't suppor
1bc50 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
1bc60 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
1bc70 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
1bc80 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f    ** and (for no
1bc90 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
1bca0 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
1bcb0 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
1bcc0 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20  ll.  .  ** It'd 
1bcd0 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
1bce0 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
1bcf0 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
1bd00 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66  void .  ** the f
1bd10 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
1bd20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
1bd30 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
1bd40 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
1bd50 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69  fd);..#elif defi
1bd60 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1bd70 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20   /* fdatasync() 
1bd80 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20  on HFS+ doesn't 
1bd90 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69  yet flush the fi
1bda0 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68  le size if it ch
1bdb0 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  anged correctly.
1bdc0 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c    ** so currentl
1bdd0 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20  y we default to 
1bde0 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72  the macro that r
1bdf0 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79  edefines fdatasy
1be00 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f  nc to fsync.  */
1be10 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64  .  rc = fsync(fd
1be20 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d  );.#else .  rc =
1be30 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a   fdatasync(fd);.
1be40 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1be50 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65   if( rc==-1 && e
1be60 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b  rrno==ENOTSUP ){
1be70 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
1be80 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
1be90 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
1bea0 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
1beb0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1bec0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1bed0 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53  YNC */..  if( OS
1bee0 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d  _VXWORKS && rc!=
1bef0 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   -1 ){.    rc = 
1bf00 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1bf10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1bf20 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
1bf30 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
1bf40 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1bf50 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
1bf60 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1bf70 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
1bf80 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
1bf90 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
1bfa0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1bfb0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1bfc0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
1bfd0 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
1bfe0 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
1bff0 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
1c000 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
1c010 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
1c020 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
1c030 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72  .** The director
1c040 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1c050 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e  r is used for on
1c060 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74  ly one thing - t
1c070 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64  o.** fsync() a d
1c080 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65  irectory to make
1c090 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74   sure file creat
1c0a0 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ion and deletion
1c0b0 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66   events.** are f
1c0c0 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20  lushed to disk. 
1c0d0 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65   Such fsyncs are
1c0e0 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e   not needed on n
1c0f0 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69  ewer.** journali
1c100 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20  ng filesystems, 
1c110 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64  but are required
1c120 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79   on older filesy
1c130 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stems..**.** Thi
1c140 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
1c150 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e   overridden usin
1c160 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c  g the xSetSysCal
1c170 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20  l interface..** 
1c180 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f  The ability to o
1c190 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75  verride this rou
1c1a0 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69  tine was added i
1c1b0 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65  n support of the
1c1c0 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  .** chromium san
1c1d0 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61  dbox.  Opening a
1c1e0 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20   directory is a 
1c1f0 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77  security risk (w
1c200 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73  e are.** told) s
1c210 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72  o making it over
1c220 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20  rideable allows 
1c230 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  the chromium san
1c240 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61  dbox to.** repla
1c250 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1c260 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20  with a harmless 
1c270 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20  no-op.  To make 
1c280 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1c290 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65  a no-op, replace
1c2a0 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20   it with a stub 
1c2b0 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c  that returns SQL
1c2c0 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1c2d0 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f  s.** *pFd set to
1c2e0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
1c2f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  er..**.** If SQL
1c300 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c310 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ed, the caller i
1c320 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1c330 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  r closing.** the
1c340 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c350 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73   *pFd using clos
1c360 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1c370 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
1c380 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1c390 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64  lename, int *pFd
1c3a0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
1c3b0 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68  nt fd = -1;.  ch
1c3c0 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f  ar zDirname[MAX_
1c3d0 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20  PATHNAME+1];..  
1c3e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1c3f0 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1c400 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  Dirname, "%s", z
1c410 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Filename);.  for
1c420 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28  (ii=(int)strlen(
1c430 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20  zDirname); ii>1 
1c440 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21  && zDirname[ii]!
1c450 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69  ='/'; ii--);.  i
1c460 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a  f( ii>0 ){.    z
1c470 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c  Dirname[ii] = '\
1c480 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  0';.    fd = rob
1c490 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  ust_open(zDirnam
1c4a0 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
1c4b0 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
1c4c0 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
1c4d0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1c4e0 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1c4f0 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1c500 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20     }.  }.  *pFd 
1c510 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28  = fd;.  return (
1c520 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a  fd>=0?SQLITE_OK:
1c530 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1c540 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1c550 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e  T, "open", zDirn
1c560 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ame));.}../*.** 
1c570 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
1c580 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
1c590 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
1c5a0 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
1c5b0 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
1c5c0 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
1c5d0 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
1c5e0 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
1c5f0 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
1c600 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
1c610 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
1c620 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
1c630 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
1c640 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
1c650 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
1c660 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
1c670 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
1c680 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1c690 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
1c6a0 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
1c6b0 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
1c6c0 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
1c6d0 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
1c6e0 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
1c6f0 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
1c700 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
1c710 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
1c720 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
1c730 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1c740 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
1c750 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
1c760 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
1c770 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
1c780 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
1c790 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
1c7a0 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
1c7b0 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1c7c0 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1c7d0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1c7e0 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
1c7f0 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
1c800 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
1c810 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
1c820 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
1c830 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
1c840 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
1c850 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
1c860 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1c870 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
1c880 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
1c890 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1c8a0 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
1c8b0 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
1c8c0 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
1c8d0 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
1c8e0 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
1c8f0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1c900 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
1c910 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1c920 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
1c930 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
1c940 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
1c950 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
1c960 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1c970 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
1c980 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
1c990 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1c9a0 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
1c9b0 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
1c9c0 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
1c9d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1c9e0 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
1c9f0 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
1ca00 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
1ca10 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
1ca20 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
1ca30 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
1ca40 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1ca50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1ca60 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
1ca70 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
1ca80 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
1ca90 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
1caa0 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
1cab0 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
1cac0 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
1cad0 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
1cae0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1caf0 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
1cb00 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1cb10 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
1cb20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
1cb30 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1cb40 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66  _IOERR_FSYNC, "f
1cb50 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c  ull_fsync", pFil
1cb60 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
1cb70 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20    /* Also fsync 
1cb80 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1cb90 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c  ntaining the fil
1cba0 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43  e if the DIRSYNC
1cbb0 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65   flag.  ** is se
1cbc0 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e  t.  This is a on
1cbd0 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e 63  e-time occurrenc
1cbe0 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73  e.  Many systems
1cbf0 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29   (examples: AIX)
1cc00 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65  .  ** are unable
1cc10 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65   to fsync a dire
1cc20 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65  ctory, so ignore
1cc30 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66   errors on the f
1cc40 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sync..  */.  if(
1cc50 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1cc60 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  s & UNIXFILE_DIR
1cc70 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  SYNC ){.    int 
1cc80 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41  dirfd;.    OSTRA
1cc90 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20  CE(("DIRSYNC %s 
1cca0 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d  (have_fullfsync=
1ccb0 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c  %d fullsync=%d)\
1ccc0 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  n", pFile->zPath
1ccd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41  ,.            HA
1cce0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73  VE_FULLFSYNC, is
1ccf0 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20  Fullsync));.    
1cd00 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
1cd10 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74  tory(pFile->zPat
1cd20 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20  h, &dirfd);.    
1cd30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cd40 4b 20 26 26 20 64 69 72 66 64 3e 3d 30 20 29 7b  K && dirfd>=0 ){
1cd50 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e  .      full_fsyn
1cd60 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a  c(dirfd, 0, 0);.
1cd70 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
1cd80 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c  se(pFile, dirfd,
1cd90 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
1cda0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1cdb0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
1cdc0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1cdd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1cde0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1cdf0 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44  s &= ~UNIXFILE_D
1ce00 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65  IRSYNC;.  }.  re
1ce10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ce20 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
1ce30 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
1ce40 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
1ce50 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
1ce60 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1ce70 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
1ce80 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
1ce90 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1cea0 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
1ceb0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
1cec0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
1ced0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1cee0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1cef0 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
1cf00 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1cf10 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1cf20 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1cf30 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
1cf40 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
1cf50 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
1cf60 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
1cf70 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
1cf80 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
1cf90 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
1cfa0 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
1cfb0 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
1cfc0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1cfd0 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
1cfe0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1cff0 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1d000 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
1d010 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
1d020 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
1d030 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1d040 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
1d050 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
1d060 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1d070 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  h, nByte);.  if(
1d080 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
1d090 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1d0a0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
1d0b0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1d0c0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1d0d0 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1d0e0 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1d0f0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
1d100 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d110 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1d120 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1d130 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1d140 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1d150 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
1d160 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1d170 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1d180 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1d190 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1d1a0 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
1d1b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
1d1c0 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
1d1d0 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1d1e0 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
1d1f0 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
1d200 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1d210 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
1d220 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
1d230 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
1d240 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
1d250 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
1d260 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
1d270 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
1d280 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
1d290 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1d2a0 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
1d2b0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
1d2c0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1d2d0 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
1d2e0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1d2f0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1d300 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
1d310 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
1d320 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
1d330 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
1d340 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
1d350 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
1d360 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
1d370 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
1d380 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
1d390 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
1d3a0 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
1d3b0 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
1d3c0 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
1d3d0 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
1d3e0 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
1d3f0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
1d400 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1d410 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
1d420 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
1d430 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1d440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d450 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
1d460 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
1d470 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
1d480 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
1d490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1d4a0 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
1d4b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1d4c0 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1d4d0 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
1d4e0 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
1d4f0 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
1d500 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
1d510 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
1d520 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1d530 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1d540 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
1d550 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1d560 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
1d570 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
1d580 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1d590 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1d5a0 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1d5b0 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1d5c0 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1d5d0 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1d5e0 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1d5f0 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1d600 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1d610 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1d620 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1d630 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1d640 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1d650 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1d660 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1d670 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1d680 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1d690 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1d6a0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1d6b0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1d6c0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1d6d0 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1d6e0 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1d6f0 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1d700 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1d710 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1d720 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1d730 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1d740 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1d750 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1d760 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1d770 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1d780 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1d790 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1d7a0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1d7b0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1d7c0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1d7d0 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1d7e0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1d7f0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1d800 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1d810 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d820 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1d830 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1d840 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1d850 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1d860 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
1d870 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1d880 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
1d890 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
1d8a0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
1d8b0 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
1d8c0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
1d8d0 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
1d8e0 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
1d8f0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1d900 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1d910 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1d920 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1d930 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1d940 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1d950 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
1d960 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1d970 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1d980 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1d990 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1d9a0 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
1d9b0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
1d9c0 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
1d9d0 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
1d9e0 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
1d9f0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
1da00 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
1da10 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1da20 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  FSTAT;.    }..  
1da30 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74    nSize = ((nByt
1da40 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  e+pFile->szChunk
1da50 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43  -1) / pFile->szC
1da60 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1da70 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20  zChunk;.    if( 
1da80 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73  nSize>(i64)buf.s
1da90 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64  t_size ){..#if d
1daa0 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
1dab0 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
1dac0 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
1dad0 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68  CATE.      /* Th
1dae0 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20  e code below is 
1daf0 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74  handling the ret
1db00 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46  urn value of osF
1db10 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20  allocate() .    
1db20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
1db30 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1db40 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
1db50 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e  "returns zero on
1db60 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20   success, .     
1db70 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20   ** or an error 
1db80 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75  number on  failu
1db90 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e  re". See the man
1dba0 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73  page for details
1dbb0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  . */.      int e
1dbc0 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  rr;.      do{.  
1dbd0 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61        err = osFa
1dbe0 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  llocate(pFile->h
1dbf0 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e  , buf.st_size, n
1dc00 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65  Size-buf.st_size
1dc10 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1dc20 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20   err==EINTR );. 
1dc30 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72       if( err ) r
1dc40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1dc50 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a  RR_WRITE;.#else.
1dc60 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1dc70 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  OS does not have
1dc80 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1dc90 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69  (), fake it. Wri
1dca0 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73  te a .      ** s
1dcb0 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68  ingle byte to th
1dcc0 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1dcd0 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66  ach block that f
1dce0 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20  alls entirely.  
1dcf0 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
1dd00 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1dd10 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75  n. Then, if requ
1dd20 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62  ired, a single b
1dd30 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  yte.      ** at 
1dd40 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29  offset (nSize-1)
1dd50 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a  , to set the siz
1dd60 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
1dd70 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  rrectly..      *
1dd80 2a 20 54 68 69 73 20 69 73 20 61 20 73 69 6d 69  * This is a simi
1dd90 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f  lar technique to
1dda0 20 74 68 61 74 20 75 73 65 64 20 62 79 20 67 6c   that used by gl
1ddb0 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20  ibc on systems. 
1ddc0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20       ** that do 
1ddd0 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1dde0 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c  fallocate() call
1ddf0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1de00 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1de10 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1de20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1de30 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1de40 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20  int nWrite = 0; 
1de50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1de60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1de70 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e  ritten by seekAn
1de80 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1de90 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1deb0 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1dec0 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1ded0 20 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e   iWrite = ((buf.
1dee0 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b  st_size + 2*nBlk
1def0 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b   - 1)/nBlk)*nBlk
1df00 2d 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  -1;.      assert
1df10 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73 74  ( iWrite>=buf.st
1df20 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  _size );.      a
1df30 73 73 65 72 74 28 20 28 69 57 72 69 74 65 2f 6e  ssert( (iWrite/n
1df40 42 6c 6b 29 3d 3d 28 28 62 75 66 2e 73 74 5f 73  Blk)==((buf.st_s
1df50 69 7a 65 2b 6e 42 6c 6b 2d 31 29 2f 6e 42 6c 6b  ize+nBlk-1)/nBlk
1df60 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1df70 74 28 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e  t( ((iWrite+1)%n
1df80 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Blk)==0 );.     
1df90 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20   for(/*no-op*/; 
1dfa0 69 57 72 69 74 65 3c 6e 53 69 7a 65 3b 20 69 57  iWrite<nSize; iW
1dfb0 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20  rite+=nBlk ){.  
1dfc0 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73        nWrite = s
1dfd0 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1dfe0 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31  e, iWrite, "", 1
1dff0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1e000 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1e010 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1e020 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RITE;.      }.  
1e030 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
1e040 30 20 7c 7c 20 28 6e 53 69 7a 65 25 6e 42 6c 6b  0 || (nSize%nBlk
1e050 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 57 72  ) ){.        nWr
1e060 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
1e070 74 65 28 70 46 69 6c 65 2c 20 6e 53 69 7a 65 2d  te(pFile, nSize-
1e080 31 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20  1, "", 1);.     
1e090 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31     if( nWrite!=1
1e0a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1e0b0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1e0c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1e0d0 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49   }.  }..#if SQLI
1e0e0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1e0f0 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  >0.  if( pFile->
1e100 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26 26  mmapSizeMax>0 &&
1e110 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d   nByte>pFile->mm
1e120 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e  apSize ){.    in
1e130 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46  t rc;.    if( pF
1e140 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20  ile->szChunk<=0 
1e150 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  ){.      if( rob
1e160 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1e170 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29  ile->h, nByte) )
1e180 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
1e190 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
1e1a0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  errno);.        
1e1b0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1e1c0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1e1d0 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1e1e0 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1e1f0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
1e200 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75     }..    rc = u
1e210 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
1e220 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65  , nByte);.    re
1e230 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
1e240 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  dif..  return SQ
1e250 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1e260 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e  * If *pArg is in
1e270 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
1e280 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
1e290 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
1e2a0 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
1e2b0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
1e2c0 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
1e2d0 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
1e2e0 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
1e2f0 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
1e300 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
1e310 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
1e320 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
1e330 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
1e340 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
1e350 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c  xModeBit(unixFil
1e360 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e  e *pFile, unsign
1e370 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e  ed char mask, in
1e380 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20  t *pArg){.  if( 
1e390 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a  *pArg<0 ){.    *
1e3a0 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63  pArg = (pFile->c
1e3b0 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29  trlFlags & mask)
1e3c0 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  !=0;.  }else if(
1e3d0 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20   (*pArg)==0 ){. 
1e3e0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1e3f0 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ags &= ~mask;.  
1e400 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
1e410 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d  ->ctrlFlags |= m
1e420 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46  ask;.  }.}../* F
1e430 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1e440 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
1e450 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
1e460 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
1e470 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49  *zBuf);../*.** I
1e480 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
1e490 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65  ontrol of an ope
1e4a0 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
1e4b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1e4c0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  xFileControl(sql
1e4d0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1e4e0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1e4f0 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  g){.  unixFile *
1e500 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1e510 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28  e*)id;.  switch(
1e520 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1e530 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 41 4c  SQLITE_FCNTL_WAL
1e540 5f 42 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20  _BLOCK: {.      
1e550 2f 2a 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  /* pFile->ctrlFl
1e560 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
1e570 42 4c 4f 43 4b 3b 20 2f 2f 20 44 65 66 65 72 72  BLOCK; // Deferr
1e580 65 64 20 66 65 61 74 75 72 65 20 2a 2f 0a 20 20  ed feature */.  
1e590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e5a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e5b0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e5c0 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
1e5d0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1e5e0 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   = pFile->eFileL
1e5f0 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ock;.      retur
1e600 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e610 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1e620 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52  TE_FCNTL_LAST_ER
1e630 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
1e640 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
1e650 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
1e660 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e670 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e680 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e690 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
1e6a0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
1e6b0 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
1e6c0 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rg;.      return
1e6d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e6e0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e6f0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1e700 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  T: {.      int r
1e710 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  c;.      Simulat
1e720 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1e730 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63  );.      rc = fc
1e740 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c  ntlSizeHint(pFil
1e750 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29  e, *(i64 *)pArg)
1e760 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1e770 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1e780 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1e790 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  c;.    }.    cas
1e7a0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1e7b0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
1e7c0 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28      unixModeBit(
1e7d0 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f  pFile, UNIXFILE_
1e7e0 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
1e7f0 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1e800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e820 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
1e830 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1e840 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  E: {.      unixM
1e850 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
1e860 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  IXFILE_PSOW, (in
1e870 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1e880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e8a0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
1e8b0 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
1e8c0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
1e8d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1e8e0 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
1e8f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1e900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e920 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
1e930 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
1e940 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
1e950 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1e960 63 36 34 28 20 70 46 69 6c 65 2d 3e 70 56 66 73  c64( pFile->pVfs
1e970 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a  ->mxPathname );.
1e980 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65        if( zTFile
1e990 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78   ){.        unix
1e9a0 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c  GetTempname(pFil
1e9b0 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e->pVfs->mxPathn
1e9c0 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20  ame, zTFile);.  
1e9d0 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
1e9e0 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20  Arg = zTFile;.  
1e9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1ea00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ea10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1ea20 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
1ea30 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  VED: {.      *(i
1ea40 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65 48  nt*)pArg = fileH
1ea50 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a  asMoved(pFile);.
1ea60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ea70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
1ea80 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1ea90 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73  P_SIZE>0.    cas
1eaa0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
1eab0 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
1eac0 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d    i64 newLimit =
1ead0 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20   *(i64*)pArg;.  
1eae0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
1eaf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
1eb00 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74  ( newLimit>sqlit
1eb10 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
1eb20 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  xMmap ){.       
1eb30 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69   newLimit = sqli
1eb40 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1eb50 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a  mxMmap;.      }.
1eb60 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72        *(i64*)pAr
1eb70 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  g = pFile->mmapS
1eb80 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66  izeMax;.      if
1eb90 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26  ( newLimit>=0 &&
1eba0 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65   newLimit!=pFile
1ebb0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26  ->mmapSizeMax &&
1ebc0 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75   pFile->nFetchOu
1ebd0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1ebe0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1ebf0 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  ax = newLimit;. 
1ec00 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
1ec10 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
1ec20 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 55 6e            unixUn
1ec30 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
1ec40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
1ec50 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
1ec60 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
1ec70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1ec80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ec90 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1eca0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1ecb0 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
1ecc0 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
1ecd0 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
1ece0 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
1ecf0 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
1ed00 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1ed10 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
1ed20 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
1ed30 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
1ed40 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
1ed50 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
1ed60 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
1ed70 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
1ed80 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1ed90 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1eda0 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
1edb0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1edc0 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
1edd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1ede0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1edf0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1ee00 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1ee10 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1ee20 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
1ee30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1ee40 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
1ee50 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
1ee60 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
1ee70 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
1ee80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
1ee90 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
1eea0 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
1eeb0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1eec0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1eed0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1eee0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
1eef0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ef00 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
1ef10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ef20 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
1ef30 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
1ef40 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
1ef50 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
1ef60 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1ef70 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
1ef80 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1ef90 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
1efa0 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
1efb0 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
1efc0 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
1efd0 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
1efe0 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
1eff0 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
1f000 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
1f010 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
1f020 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
1f030 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
1f040 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
1f050 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
1f060 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
1f070 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1f080 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
1f090 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
1f0a0 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e  /.#ifndef __QNXN
1f0b0 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74  TO__ .static int
1f0c0 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
1f0d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
1f0e0 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
1f0f0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1f100 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
1f110 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
1f120 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64  TOR_SIZE;.}.#end
1f130 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1f140 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20  llowing version 
1f150 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  of unixSectorSiz
1f160 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  e() is optimized
1f170 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66   for QNX..*/.#if
1f180 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23  def __QNXNTO__.#
1f190 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d  include <sys/dcm
1f1a0 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64  d_blk.h>.#includ
1f1b0 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68  e <sys/statvfs.h
1f1c0 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  >.static int uni
1f1d0 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
1f1e0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
1f1f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1f200 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1f210 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  ;.  if( pFile->s
1f220 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29  ectorSize == 0 )
1f230 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
1f240 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  tvfs fsInfo;.   
1f250 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20      .    /* Set 
1f260 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e  defaults for non
1f270 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73  -supported files
1f280 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46  ystems */.    pF
1f290 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f2a0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
1f2b0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
1f2c0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f2d0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f2e0 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61   0;.    if( fsta
1f2f0 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26  tvfs(pFile->h, &
1f300 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  fsInfo) == -1 ) 
1f310 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1f320 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f330 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1f340 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
1f350 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70  f_basetype, "tmp
1f360 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ") ) {.      pFi
1f370 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f380 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1f390 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1f3a0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f3b0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
1f3c0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f3d0 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41  C4K |       /* A
1f3e0 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  ll ram filesyste
1f3f0 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
1f400 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
1f410 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1f420 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
1f430 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
1f440 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
1f450 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1f480 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
1f490 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
1f4a0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1f4b0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
1f4c0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
1f4d0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
1f4e0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f500 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
1f510 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
1f520 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
1f530 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
1f540 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
1f550 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a  ype, "etfs") ){.
1f560 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1f570 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1f580 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1f590 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1f5a0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1f5b0 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63         /* etfs c
1f5c0 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74  luster size writ
1f5d0 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
1f5e0 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d  .        (pFile-
1f5f0 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
1f600 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
1f610 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20  _ATOMIC512) |.  
1f620 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f630 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1f640 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1f650 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1f660 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1f6a0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1f6b0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f6c0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1f6d0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1f6e0 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1f6f0 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1f730 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1f740 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1f750 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
1f760 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
1f770 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x6") ){.      pF
1f780 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f790 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
1f7a0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
1f7b0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1f7c0 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
1f7d0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1f7e0 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20  IC |         /* 
1f7f0 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77  All filesystem w
1f800 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
1f810 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1f820 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1f830 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
1f840 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
1f850 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1f860 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f880 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1f890 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
1f8a0 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1f8b0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f8c0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f8d0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f8e0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f8f0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f910 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f920 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f930 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f940 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
1f950 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1f960 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20  e, "qnx4") ){.  
1f970 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f980 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1f990 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1f9a0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f9b0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1f9c0 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
1f9d0 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
1f9e0 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
1f9f0 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
1fa00 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
1fa10 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
1fa20 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
1fa30 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
1fa40 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
1fa50 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1fa60 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
1fa70 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
1fa80 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
1fa90 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fac0 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
1fad0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
1fae0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1faf0 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
1fb00 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22  _basetype, "dos"
1fb10 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1fb20 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1fb30 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1fb40 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1fb50 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fb60 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
1fb70 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
1fb80 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
1fb90 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
1fba0 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
1fbb0 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
1fbc0 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
1fbd0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1fbe0 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
1fbf0 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
1fc00 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1fc10 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1fc20 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1fc30 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1fc40 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc60 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1fc70 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1fc80 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1fc90 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
1fca0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1fcb0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1fcc0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
1fcd0 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20  TOMIC512 |      
1fce0 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74  /* blocks are at
1fcf0 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1fd00 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1fd10 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
1fd20 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
1fd30 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1fd40 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1fd70 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
1fd80 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ds */.        0;
1fd90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
1fda0 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69  Last chance veri
1fdb0 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  fication.  If th
1fdc0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1fdd0 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  n't a multiple o
1fde0 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20  f 512.  ** then 
1fdf0 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a  it isn't valid.*
1fe00 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
1fe10 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20  ectorSize % 512 
1fe20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  != 0 ){.    pFil
1fe30 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1fe40 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
1fe50 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1fe60 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
1fe70 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1fe80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1fe90 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1fea0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f  ;.}.#endif /* __
1feb0 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a  QNXNTO__ */../*.
1fec0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
1fed0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1fee0 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
1fef0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46  e..**.** This VF
1ff00 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72  S is set up to r
1ff10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
1ff20 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1ff30 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c  RWRITE by defaul
1ff40 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  t..** However, t
1ff50 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f  hat choice is co
1ff60 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63  ntroversial sinc
1ff70 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  e technically th
1ff80 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
1ff90 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73  file system does
1ffa0 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76   not always prov
1ffb0 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76  ide powersafe ov
1ffc0 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f  erwrites.  (In o
1ffd0 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
1ffe0 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73  fter a power-los
1fff0 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f  s event, parts o
20000 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  f the file that 
20010 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72  were never.** wr
20020 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20  itten might end 
20030 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64  up being altered
20040 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e  .)  However, non
20050 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69  -PSOW behavior i
20060 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20  s very,.** very 
20070 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72  rare.  And asser
20080 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20  ting PSOW makes 
20090 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f  a large reductio
200a0 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  n in the amount.
200b0 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49  ** of required I
200c0 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e  /O for journalin
200d0 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f  g, since a lot o
200e0 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69  f padding is eli
200f0 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e  minated..**  Hen
20100 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53  ce, while POWERS
20110 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73  AFE_OVERWRITE is
20120 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20   on by default, 
20130 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d  there is a file-
20140 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c  control.** avail
20150 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
20160 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72  off and URI quer
20170 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69  y parameter avai
20180 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
20190 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
201a0 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
201b0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
201c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
201d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
201e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
201f0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69    int rc = 0;.#i
20200 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a  fdef __QNXNTO__.
20210 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53    if( p->sectorS
20220 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63  ize==0 ) unixSec
20230 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72  torSize(id);.  r
20240 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61  c = p->deviceCha
20250 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65  racteristics;.#e
20260 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74  ndif.  if( p->ct
20270 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
20280 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72  LE_PSOW ){.    r
20290 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41  c |= SQLITE_IOCA
202a0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
202b0 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74  WRITE;.  }.  ret
202c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21  urn rc;.}..#if !
202d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
202e0 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
202f0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
20300 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  >0../*.** Return
20310 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65   the system page
20320 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
20330 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
20340 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
20350 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65  directly by othe
20360 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  r code in this f
20370 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64  ile. .** Instead
20380 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63  , it should be c
20390 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20  alled via macro 
203a0 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e  osGetpagesize().
203b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
203c0 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76  nixGetpagesize(v
203d0 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  oid){.#if OS_VXW
203e0 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30  ORKS.  return 10
203f0 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  24;.#elif define
20400 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20  d(_BSD_SOURCE). 
20410 20 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73   return getpages
20420 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72  ize();.#else.  r
20430 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f  eturn (int)sysco
20440 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29  nf(_SC_PAGESIZE)
20450 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64  ;.#endif.}..#end
20460 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
20470 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
20480 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
20490 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69  AP_SIZE>0 */..#i
204a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
204b0 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  T_WAL../*.** Obj
204c0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
204d0 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
204e0 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
204f0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
20500 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
20510 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
20520 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
20530 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
20540 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
20550 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
20560 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
20570 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
20580 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
20590 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
205a0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
205b0 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
205c0 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
205d0 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
205e0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
205f0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
20600 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
20610 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
20620 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
20630 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
20640 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
20650 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
20660 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
20670 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
20680 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
20690 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
206a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
206b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
206c0 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
206d0 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
206e0 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
206f0 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
20700 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
20710 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
20720 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
20730 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
20740 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20750 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
20760 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20770 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
20780 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
20790 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
207a0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
207b0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
207c0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
207d0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
207e0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
207f0 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
20800 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
20810 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
20820 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
20830 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
20840 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
20850 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
20860 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
20870 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
20880 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
20890 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
208a0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
208b0 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
208c0 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
208d0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
208e0 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
208f0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
20900 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
20910 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
20920 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
20930 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
20940 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
20950 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
20960 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
20970 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
20980 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
20990 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
209a0 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
209b0 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
209c0 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
209d0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
209e0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
209f0 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
20a00 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
20a30 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
20a40 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
20a50 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20a60 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
20a70 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
20a80 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
20a90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20aa0 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
20ab0 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
20ac0 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
20ad0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
20ae0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
20af0 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
20b00 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
20b10 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
20b20 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
20b30 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
20b60 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
20b70 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
20b80 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
20b90 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
20ba0 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
20bb0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
20bc0 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
20bd0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
20be0 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
20bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
20c00 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
20c10 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
20c20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
20c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
20c40 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
20c50 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
20c60 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
20c70 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
20c80 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
20c90 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
20ca0 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
20cb0 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
20cc0 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
20cd0 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
20ce0 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
20cf0 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
20d00 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
20d10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
20d20 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
20d30 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
20d40 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
20d50 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
20d60 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
20d70 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
20d80 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
20d90 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
20da0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
20db0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
20dc0 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
20dd0 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
20de0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
20df0 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
20e00 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
20e10 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
20e20 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
20e30 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
20e40 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
20e50 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
20e60 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
20e70 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
20e80 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
20e90 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
20ea0 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
20eb0 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
20ec0 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
20ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20ee0 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
20ef0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
20f00 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20  x */.  u8 id;   
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
20f30 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
20f40 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
20f50 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  e */.  u16 share
20f60 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
20f70 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
20f80 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
20f90 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
20fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
20fb0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
20fc0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
20fd0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  /.};../*.** Cons
20fe0 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
20ff0 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
21000 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
21010 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
21020 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
21030 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
21040 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
21050 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
21060 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
21070 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
21080 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
21090 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
210a0 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
210b0 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
210c0 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
210d0 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
210e0 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
210f0 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
21100 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
21110 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
21120 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
21130 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
21140 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
21150 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
21160 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
21170 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
21180 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
21190 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  WAL file */.  in
211a0 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
211b0 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
211c0 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
211d0 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
211e0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
211f0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
21200 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
21210 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
21240 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
21250 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
21260 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70  pShmNode; /* App
21270 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
21280 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
21290 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
212a0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b   struct flock f;
212b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
212c0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
212d0 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
212e0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
212f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
21300 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
21310 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
21320 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
21330 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
21340 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
21350 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
21360 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46  .  pShmNode = pF
21370 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  ile->pInode->pSh
21380 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  mNode;.  assert(
21390 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
213a0 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
213b0 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
213c0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
213d0 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
213e0 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
213f0 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
21400 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
21410 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
21420 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
21430 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
21440 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
21450 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49  ( n>=1 && n<SQLI
21460 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
21470 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
21480 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  >h>=0 ){.    int
21490 20 6c 6b 54 79 70 65 3b 0a 20 20 20 20 2f 2a 20   lkType;.    /* 
214a0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
214b0 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
214c0 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
214d0 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
214e0 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
214f0 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
21500 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
21510 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
21520 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
21530 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
21540 20 20 20 6c 6b 54 79 70 65 20 3d 20 28 70 46 69     lkType = (pFi
21550 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
21560 55 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b 29 21  UNIXFILE_BLOCK)!
21570 3d 30 20 3f 20 46 5f 53 45 54 4c 4b 57 20 3a 20  =0 ? F_SETLKW : 
21580 46 5f 53 45 54 4c 4b 3b 0a 20 20 20 20 72 63 20  F_SETLK;.    rc 
21590 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f  = osFcntl(pShmNo
215a0 64 65 2d 3e 68 2c 20 6c 6b 54 79 70 65 2c 20 26  de->h, lkType, &
215b0 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  f);.    rc = (rc
215c0 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
215d0 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
215e0 59 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  Y;.    pFile->ct
215f0 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58  rlFlags &= ~UNIX
21600 46 49 4c 45 5f 42 4c 4f 43 4b 3b 0a 20 20 7d 0a  FILE_BLOCK;.  }.
21610 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
21620 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61   global lock sta
21630 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20  te and do debug 
21640 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65  tracing */.#ifde
21650 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21660 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f   { u16 mask;.  O
21670 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
21680 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  K "));.  mask = 
21690 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66  ofst>31 ? 0xffff
216a0 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   : (1<<(ofst+n))
216b0 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
216c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
216d0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
216e0 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
216f0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
21700 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ("unlock %d ok",
21710 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
21720 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
21730 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
21740 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
21750 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
21760 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
21770 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
21780 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
21790 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64  E(("read-lock %d
217a0 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
217b0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
217c0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
217d0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
217e0 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
217f0 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
21800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
21810 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
21820 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
21830 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
21840 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
21850 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
21860 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
21870 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21880 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
21890 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
218a0 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  se{.    if( lock
218b0 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
218c0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
218d0 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  "unlock %d faile
218e0 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
218f0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
21900 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
21910 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
21920 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
21930 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
21940 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
21950 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
21960 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
21970 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
21980 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
21990 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
219a0 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77  RACE((" - afterw
219b0 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e  ards %03x,%03x\n
219c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ",.           pS
219d0 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
219e0 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78  sk, pShmNode->ex
219f0 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65  clMask));.  }.#e
21a00 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
21a10 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  c;        .}../*
21a20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
21a30 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
21a40 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e   32KB shm region
21a50 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
21a60 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20   mapped at.** a 
21a70 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  time, assuming t
21a80 68 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67  hat each mapping
21a90 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65   must be an inte
21aa0 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
21ab0 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73  the.** current s
21ac0 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e  ystem page-size.
21ad0 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  .**.** Usually, 
21ae0 74 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65  this is 1. The e
21af0 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74  xception seems t
21b00 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61  o be systems tha
21b10 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64  t are configured
21b20 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20  .** to use 64KB 
21b30 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20  pages - in this 
21b40 63 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e  case each mappin
21b50 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20  g must cover at 
21b60 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d  least two.** shm
21b70 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61   regions..*/.sta
21b80 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52  tic int unixShmR
21b90 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64  egionPerMap(void
21ba0 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d  ){.  int shmsz =
21bb0 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20   32*1024;       
21bc0 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69       /* SHM regi
21bd0 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  on size */.  int
21be0 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67   pgsz = osGetpag
21bf0 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79  esize();   /* Sy
21c00 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a  stem page size *
21c10 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67  /.  assert( ((pg
21c20 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29  sz-1)&pgsz)==0 )
21c30 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  ;   /* Page size
21c40 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
21c50 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70   of 2 */.  if( p
21c60 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75  gsz<shmsz ) retu
21c70 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn 1;.  return p
21c80 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a  gsz/shmsz;.}../*
21c90 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
21ca0 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
21cb0 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
21cc0 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
21cd0 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
21ce0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
21cf0 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
21d00 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
21d10 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
21d20 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
21d30 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
21d40 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
21d50 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
21d60 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
21d70 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
21d80 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
21d90 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
21da0 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
21db0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
21dc0 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66  if( p && p->nRef
21dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
21de0 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78  ShmPerMap = unix
21df0 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28  ShmRegionPerMap(
21e00 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  );.    int i;.  
21e10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e    assert( p->pIn
21e20 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65  ode==pFd->pInode
21e30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
21e40 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
21e50 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
21e60 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
21e70 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b   i+=nShmPerMap){
21e80 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e  .      if( p->h>
21e90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73  =0 ){.        os
21ea0 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69  Munmap(p->apRegi
21eb0 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69  on[i], p->szRegi
21ec0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  on);.      }else
21ed0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21ee0 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
21ef0 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  on[i]);.      }.
21f00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21f10 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
21f20 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  on);.    if( p->
21f30 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f  h>=0 ){.      ro
21f40 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20  bust_close(pFd, 
21f50 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  p->h, __LINE__);
21f60 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31  .      p->h = -1
21f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
21f80 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
21f90 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
21fa0 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
21fb0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68  ./*.** Open a sh
21fc0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
21fd0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21fe0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
21ff0 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20  ile pDbFd.  .** 
22000 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
22010 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
22020 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ses mmapped file
22030 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  s..**.** The fil
22040 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
22050 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ent shared-memor
22060 79 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65  y is in the same
22070 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73   directory.** as
22080 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
22090 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20  se file and has 
220a0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
220b0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
220c0 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20  se.** file with 
220d0 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69  the "-shm" suffi
220e0 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78  x added.  For ex
220f0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61  ample, if the da
22100 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
22110 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  s "/home/user1/c
22120 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74  onfig.db" then t
22130 68 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20  he file that is 
22140 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70  created and mmap
22150 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65  ped.** for share
22160 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
22170 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75   called "/home/u
22180 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73  ser1/config.db-s
22190 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f  hm".  .**.** Ano
221a0 74 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f  ther approach to
221b0 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73   is to use files
221c0 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20   in /dev/shm or 
221d0 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a  /dev/tmp or an.*
221e0 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70  * some other tmp
221f0 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66  fs mount. But if
22200 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66   a file in a dif
22210 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  ferent directory
22220 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74  .** from the dat
22230 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73  abase file is us
22240 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69  ed, then differi
22250 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  ng access permis
22260 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68  sions.** or a ch
22270 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75  root() might cau
22280 73 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74  se two different
22290 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68   processes on th
222a0 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61  e same.** databa
222b0 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69  se to end up usi
222c0 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  ng different fil
222d0 65 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  es for shared me
222e0 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69  mory - .** meani
222f0 6e 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65  ng that their me
22300 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72  mory would not r
22310 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20  eally be shared 
22320 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69  - resulting.** i
22330 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  n database corru
22340 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65  ption.  Neverthe
22350 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73  less, this tmpfs
22360 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63   file usage.** c
22370 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74  an be enabled at
22380 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73   compile-time us
22390 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d  ing -DSQLITE_SHM
223a0 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76  _DIRECTORY="/dev
223b0 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20  /shm".** or the 
223c0 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65  equivalent.  The
223d0 20 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49   use of the SQLI
223e0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
223f0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a   compile-time.**
22400 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20   option results 
22410 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
22420 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69  le build of SQLi
22430 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53  te;  builds of S
22440 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69  QLite.** that wi
22450 74 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c  th differing SQL
22460 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22470 59 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d  Y settings attem
22480 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  pt to use the.**
22490 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
224a0 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ile at the same 
224b0 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63  time, database c
224c0 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c  orruption will l
224d0 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e  ikely.** result.
224e0 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   The SQLITE_SHM_
224f0 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
22500 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
22510 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22   considered.** "
22520 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64  unsupported" and
22530 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20   may go away in 
22540 61 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20  a future SQLite 
22550 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57  release..**.** W
22560 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  hen opening a ne
22570 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  w shared-memory 
22580 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65  file, if no othe
22590 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
225a0 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20  hat.** file are 
225b0 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
225c0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
225d0 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63  or in other proc
225e0 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74  esses, then.** t
225f0 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  he file must be 
22600 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
22610 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65  o length or have
22620 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61   its header clea
22630 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
22640 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
22650 61 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29  ase file (pDbFd)
22660 20 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75   is using the "u
22670 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a  nix-excl" VFS.**
22680 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
22690 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
226a0 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
226b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
226c0 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f  and.** that no o
226d0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
226e0 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20  re able to read 
226f0 6f 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74  or write the dat
22700 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68  abase.  In.** th
22710 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e  at case, we do n
22720 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73  ot really need s
22730 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e  hared memory.  N
22740 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a  o shared memory.
22750 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ** file is creat
22760 65 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20  ed.  The shared 
22770 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73  memory will be s
22780 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65  imulated with he
22790 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ap memory..*/.st
227a0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
227b0 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e  nSharedMemory(un
227c0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  ixFile *pDbFd){.
227d0 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
227e0 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *p = 0;        
227f0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
22800 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
22810 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
22820 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
22830 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  de;   /* The und
22840 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
22850 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
22860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
22880 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  ult code */.  un
22890 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
228a0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
228b0 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64   The inode of fd
228c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d   */.  char *zShm
228d0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
228e0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
228f0 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66   the file used f
22900 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20  or SHM */.  int 
22910 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  nShmFilename;   
22920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22930 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66  ize of the SHM f
22940 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  ilename in bytes
22950 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
22960 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
22970 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a   new unixShm obj
22980 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71  ect. */.  p = sq
22990 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
229a0 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
229b0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
229c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
229d0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
229e0 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73  izeof(*p));.  as
229f0 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
22a00 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  m==0 );..  /* Ch
22a10 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
22a20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
22a30 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ct already exist
22a40 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69 73  s. Reuse an exis
22a50 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66  ting.  ** one if
22a60 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65   present. Create
22a70 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
22a80 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
22a90 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
22aa0 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62  ;.  pInode = pDb
22ab0 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53  Fd->pInode;.  pS
22ac0 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  hmNode = pInode-
22ad0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28  >pShmNode;.  if(
22ae0 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a   pShmNode==0 ){.
22af0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
22b00 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
22b10 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28         /* fstat(
22b20 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62  ) info for datab
22b30 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e  ase file */.#ifn
22b40 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
22b50 49 52 45 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e  IRECTORY.    con
22b60 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61  st char *zBasePa
22b70 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74  th = pDbFd->zPat
22b80 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  h;.#endif..    /
22b90 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74  * Call fstat() t
22ba0 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
22bb0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
22bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22bd0 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e  e. If.    ** a n
22be0 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73  ew *-shm file is
22bf0 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74   created, an att
22c00 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64  empt will be mad
22c10 65 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20  e to create it. 
22c20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73     ** with the s
22c30 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ame permissions.
22c40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22c50 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68  osFstat(pDbFd->h
22c60 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e  , &sStat) && pIn
22c70 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
22c80 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
22c90 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
22ca0 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
22cb0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
22cc0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
22cd0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22ce0 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  RY.    nShmFilen
22cf0 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c  ame = sizeof(SQL
22d00 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22d10 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20  Y) + 31;.#else. 
22d20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
22d30 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65  = 6 + (int)strle
22d40 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65  n(zBasePath);.#e
22d50 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
22d60 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
22d70 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 53  oc64( sizeof(*pS
22d80 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69  hmNode) + nShmFi
22d90 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66  lename );.    if
22da0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
22db0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22dc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
22dd0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
22de0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  r;.    }.    mem
22df0 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c  set(pShmNode, 0,
22e00 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
22e10 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29  e)+nShmFilename)
22e20 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61  ;.    zShmFilena
22e30 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  me = pShmNode->z
22e40 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
22e50 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
22e60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
22e70 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
22e80 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
22e90 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
22ea0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  ShmFilename, .  
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49     SQLITE_SHM_DI
22ed0 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65  RECTORY "/sqlite
22ee0 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20  -shm-%x-%x",.   
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f00 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f    (u32)sStat.st_
22f10 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e  ino, (u32)sStat.
22f20 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20  st_dev);.#else. 
22f30 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
22f40 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
22f50 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
22f60 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50  "%s-shm", zBaseP
22f70 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
22f80 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
22f90 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46  Fd->zPath, zShmF
22fa0 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
22fb0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  .    pShmNode->h
22fc0 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64   = -1;.    pDbFd
22fd0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
22fe0 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20  de = pShmNode;. 
22ff0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e     pShmNode->pIn
23000 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
23010 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
23020 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
23030 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
23040 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
23050 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
23060 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
23070 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
23080 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
23090 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
230a0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
230b0 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
230c0 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
230d0 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73     int openFlags
230e0 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
230f0 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73  EAT;.      if( s
23100 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
23110 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  an(pDbFd->zPath,
23120 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c   "readonly_shm",
23130 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f   0) ){.        o
23140 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
23150 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68  NLY;.        pSh
23160 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
23170 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 1;.      }. 
23180 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68       pShmNode->h
23190 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
231a0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65  ShmFilename, ope
231b0 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73  nFlags, (sStat.s
231c0 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20  t_mode&0777));. 
231d0 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
231e0 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20  e->h<0 ){.      
231f0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
23200 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
23210 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
23220 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
23230 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
23240 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
23250 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
23260 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
23270 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
23280 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
23290 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20   the SHM file.  
232a0 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20      ** is owned 
232b0 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65 72  by the same user
232c0 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f   that owns the o
232d0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
232e0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  .  Otherwise,.  
232f0 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
23300 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e  nal owner will n
23310 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f  ot be able to co
23320 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  nnect..      */.
23330 20 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f        robustFcho
23340 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
23350 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
23360 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a  tat.st_gid);.  .
23370 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
23380 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
23390 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
233a0 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
233b0 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
233c0 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
233d0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
233e0 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
233f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
23400 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23410 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
23420 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
23430 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
23440 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
23450 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
23460 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
23470 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
23480 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
23490 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
234a0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
234b0 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
234c0 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
234d0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
234e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
234f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23500 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
23510 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
23520 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
23530 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
23540 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23550 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
23560 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
23570 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
23580 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
23590 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
235a0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
235b0 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
235c0 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
235d0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
235e0 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
235f0 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
23600 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
23610 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
23620 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
23630 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
23640 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
23650 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
23660 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
23670 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
23680 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
23690 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
236a0 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
236b0 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
236c0 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
236d0 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
236e0 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
236f0 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
23700 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
23710 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
23720 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
23730 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
23740 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
23750 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
23760 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
23770 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
23780 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
23790 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
237a0 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
237b0 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
237c0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
237d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
237e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
237f0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
23800 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
23810 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
23820 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
23830 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
23840 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
23850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23860 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
23870 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
23880 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
23890 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
238a0 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
238b0 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
238c0 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
238d0 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
238e0 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
238f0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
23900 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23910 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23920 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
23930 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
23940 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
23950 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
23960 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
23970 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
23980 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
23990 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
239a0 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
239b0 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
239c0 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
239d0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
239e0 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
239f0 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
23a00 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
23a10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
23a20 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
23a30 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
23a40 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
23a50 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
23a60 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
23a70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
23a80 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
23a90 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
23aa0 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
23ab0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
23ac0 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
23ad0 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
23ae0 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
23af0 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
23b00 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
23b10 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
23b20 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
23b30 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
23b40 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
23b50 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
23b60 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
23b70 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
23b80 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
23b90 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
23ba0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
23bb0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
23bc0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
23bd0 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
23be0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
23bf0 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
23c00 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
23c10 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
23c20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
23c30 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
23c40 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
23c50 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
23c60 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
23c70 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
23c80 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
23c90 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
23ca0 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
23cb0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
23cc0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
23cd0 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
23ce0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
23cf0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
23d00 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
23d10 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
23d20 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23d40 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
23d50 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
23d60 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
23d70 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
23d80 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
23d90 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
23da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23db0 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
23dc0 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
23dd0 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
23de0 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
23df0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
23e00 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
23e10 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
23e20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
23e30 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
23e40 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
23e50 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
23e60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23e70 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50  _OK;.  int nShmP
23e80 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52  erMap = unixShmR
23e90 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20  egionPerMap();. 
23ea0 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b   int nReqRegion;
23eb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
23ec0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
23ed0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
23ee0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
23ef0 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
23f00 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
23f10 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
23f20 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
23f30 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
23f40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
23f50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
23f60 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
23f70 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
23f80 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
23f90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
23fa0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
23fb0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
23fc0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
23fd0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
23fe0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
23ff0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
24000 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
24010 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
24020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
24030 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
24040 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
24050 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
24060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
24070 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
24080 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
24090 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
240a0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
240b0 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72  ber of regions r
240c0 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61  equired to be ma
240d0 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52  pped. */.  nReqR
240e0 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f  egion = ((iRegio
240f0 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20  n+nShmPerMap) / 
24100 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53  nShmPerMap) * nS
24110 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28  hmPerMap;..  if(
24120 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
24130 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
24140 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
24150 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
24160 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
24170 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
24180 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
24190 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a   = nReqRegion*sz
241a0 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e  Region;   /* Min
241b0 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
241c0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
241d0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
241e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
241f0 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
24200 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
24210 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
24220 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
24230 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
24240 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
24250 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
24260 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
24270 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
24280 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
24290 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
242a0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
242b0 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
242c0 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
242d0 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
242e0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
242f0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
24300 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
24310 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
24320 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
24330 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
24340 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
24350 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24360 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
24370 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
24380 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
24390 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
243a0 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
243b0 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
243c0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
243d0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
243e0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
243f0 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
24400 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
24410 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
24420 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
24430 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
24440 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
24450 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
24460 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
24470 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
24480 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
24490 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
244a0 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
244b0 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
244c0 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
244d0 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
244e0 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
244f0 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
24500 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
24510 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
24520 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
24530 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
24540 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
24550 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
24560 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
24570 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
24580 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
24590 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
245a0 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
245b0 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
245c0 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
245d0 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
245e0 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
245f0 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
24600 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
24610 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
24620 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
24630 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
24640 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
24650 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
24660 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
24670 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
24680 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
24690 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
246a0 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
246b0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
246c0 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
246d0 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
246e0 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
246f0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
24700 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
24710 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
24720 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
24730 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
24740 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
24750 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
24760 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
24770 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64  ( seekAndWriteFd
24780 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50  (pShmNode->h, iP
24790 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c  g*pgsz + pgsz-1,
247a0 20 22 22 2c 20 31 2c 20 30 29 21 3d 31 20 29 7b   "", 1, 0)!=1 ){
247b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
247c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
247d0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
247e0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  lename;.        
247f0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
24800 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
24810 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77  OERR_SHMSIZE, "w
24820 72 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  rite", zFile);. 
24830 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
24840 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
24850 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24870 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24880 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
24890 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
248a0 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
248b0 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
248c0 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
248d0 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72     apNew = (char
248e0 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c   **)sqlite3_real
248f0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68  loc(.        pSh
24900 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c  mNode->apRegion,
24910 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65   nReqRegion*size
24920 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29  of(char *).    )
24930 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
24940 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
24950 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
24960 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
24970 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
24980 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
24990 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  pRegion = apNew;
249a0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
249b0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52  Node->nRegion<nR
249c0 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  eqRegion ){.    
249d0 20 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52    int nMap = szR
249e0 65 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70  egion*nShmPerMap
249f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
24a00 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b       void *pMem;
24a10 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
24a20 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
24a30 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d       pMem = osMm
24a40 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20  ap(0, nMap,.    
24a50 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
24a60 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50  ->isReadonly ? P
24a70 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f  ROT_READ : PROT_
24a80 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
24a90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41   .            MA
24aa0 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f  P_SHARED, pShmNo
24ab0 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a  de->h, szRegion*
24ac0 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e  (i64)pShmNode->n
24ad0 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29  Region.        )
24ae0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
24af0 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  em==MAP_FAILED )
24b00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
24b10 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
24b20 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
24b30 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e  P, "mmap", pShmN
24b40 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
24b50 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
24b60 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
24b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
24b80 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
24b90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
24ba0 63 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20  c64(szRegion);. 
24bb0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
24bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24bd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
24be0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  M;.          got
24bf0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
24c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24c10 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c   memset(pMem, 0,
24c20 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20   szRegion);.    
24c30 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
24c40 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70  =0; i<nShmPerMap
24c50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
24c60 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
24c70 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
24c80 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61  gion+i] = &((cha
24c90 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f  r*)pMem)[szRegio
24ca0 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n*i];.      }.  
24cb0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
24cc0 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72  egion += nShmPer
24cd0 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Map;.    }.  }..
24ce0 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
24cf0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
24d00 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
24d10 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f      *pp = pShmNo
24d20 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65  de->apRegion[iRe
24d30 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gion];.  }else{.
24d40 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
24d50 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
24d60 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72  >isReadonly && r
24d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
24d80 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
24d90 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  NLY;.  sqlite3_m
24da0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
24db0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
24dc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24dd0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
24de0 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
24df0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
24e00 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ment..**.** Note
24e10 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69   that the relati
24e20 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53  onship between S
24e30 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53  HAREd and EXCLUS
24e40 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c  IVE locks is a l
24e50 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65  ittle.** differe
24e60 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20  nt here than in 
24e70 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c  posix.  In xShmL
24e80 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67  ock(), one can g
24e90 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a  o from unlocked.
24ea0 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64  ** to shared and
24eb0 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e   back or from un
24ec0 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73  locked to exclus
24ed0 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42  ive and back.  B
24ee0 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f  ut one may.** no
24ef0 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64  t go from shared
24f00 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72   to exclusive or
24f10 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20   from exclusive 
24f20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74  to shared..*/.st
24f30 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
24f40 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
24f50 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
24f60 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
24f70 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
24f80 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
24f90 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24fb0 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
24fc0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
24fd0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ff0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
25000 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
25010 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
25020 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
25030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
25040 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
25050 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  e lock */.){.  u
25060 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
25070 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20   (unixFile*)fd; 
25080 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
25090 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
250a0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e  d memory */.  un
250b0 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  ixShm *p = pDbFd
250c0 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
250d0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
250e0 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
250f0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  ocked */.  unixS
25100 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25120 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
25130 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
25140 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  s */.  unixShmNo
25150 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
25160 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20  ->pShmNode;  /* 
25170 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  The underlying f
25180 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69  ile iNode */.  i
25190 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
251a0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
251b0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
251c0 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
251d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
251f0 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
25200 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
25210 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
25220 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
25230 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
25240 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
25250 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
25260 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
25270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  );.  assert( ofs
25280 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
25290 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
252a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
252b0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
252c0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
252d0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
252e0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
252f0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
25300 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
25310 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
25320 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
25330 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
25340 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
25350 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
25360 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
25370 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
25380 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
25390 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
253a0 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
253b0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
253c0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
253d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
253e0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
253f0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
25400 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
25410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
25420 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
25430 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
25440 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
25450 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28  ..  mask = (1<<(
25460 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
25470 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fst);.  assert( 
25480 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
25490 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
254a0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
254b0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
254c0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
254d0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
254e0 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
254f0 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
25500 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
25510 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
25520 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
25530 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
25540 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
25550 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
25560 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
25570 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
25580 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
25590 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
255a0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
255b0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
255c0 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
255d0 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
255e0 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
255f0 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
25600 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
25610 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
25620 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
25630 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
25640 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
25650 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
25660 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
25670 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  , F_UNLCK, ofst+
25680 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
25690 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
256a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
256b0 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
256c0 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
256d0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
256e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
256f0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
25700 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
25710 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
25720 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
25730 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
25740 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
25750 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
25760 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
25770 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
25780 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
25790 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
257a0 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
257b0 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
257c0 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
257d0 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
257e0 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
257f0 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
25800 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
25810 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
25820 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
25830 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
25840 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
25850 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
25860 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
25870 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
25880 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
25890 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
258a0 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
258b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
258c0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
258d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
258e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
258f0 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
25900 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
25910 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
25920 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
25930 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
25940 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
25950 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
25970 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
25980 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
25990 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
259a0 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
259b0 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_RDLCK, ofst+UN
259c0 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
259d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
259e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
259f0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
25a00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
25a10 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64  the local shared
25a20 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
25a30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25a40 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  ){.      p->shar
25a50 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
25a60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
25a70 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
25a80 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  no sibling conne
25a90 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b  ctions hold lock
25aa0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63  s that will bloc
25ab0 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f  k this.    ** lo
25ac0 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20  ck.  If any do, 
25ad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
25ae0 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  SY right away.. 
25af0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
25b00 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
25b10 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
25b20 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
25b30 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
25b40 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d  mask)!=0 || (pX-
25b50 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
25b60 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
25b70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
25b80 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
25b90 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
25ba0 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  .  .    /* Get t
25bb0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
25bc0 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
25bd0 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
25be0 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
25bf0 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
25c00 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
25c10 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
25c20 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
25c30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25c40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
25c50 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
25c60 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20  pDbFd, F_WRLCK, 
25c70 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
25c80 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
25c90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25ca0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
25cb0 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
25cc0 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
25cd0 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
25ce0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
25cf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
25d00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
25d10 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
25d20 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
25d30 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
25d40 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
25d50 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
25d60 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
25d70 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d   osGetpid(0), p-
25d80 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
25d90 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65  exclMask));.  re
25da0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25db0 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
25dc0 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
25dd0 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
25de0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
25df0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
25e00 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
25e10 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
25e20 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
25e30 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
25e40 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
25e50 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
25e60 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
25e70 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61  c void unixShmBa
25e80 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
25e90 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
25ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
25eb0 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
25ec0 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
25ed0 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
25ee0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
25ef0 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72  ;.  sqlite3Memor
25f00 79 42 61 72 72 69 65 72 28 29 3b 20 20 20 20 20  yBarrier();     
25f10 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d      /* compiler-
25f20 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62  defined memory b
25f30 61 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e 69 78  arrier */.  unix
25f40 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20  EnterMutex();   
25f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
25f60 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72  lso mutex, for r
25f70 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75  edundancy */.  u
25f80 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
25f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
25fa0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
25fb0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
25fc0 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
25fd0 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
25fe0 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
25ff0 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
26000 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68  f there is no sh
26010 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
26020 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
26030 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20  connection then 
26040 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
26050 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
26060 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
26070 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28  nt unixShmUnmap(
26080 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
26090 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
260a0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
260b0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
260c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
260d0 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
260e0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
260f0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
26100 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
26110 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
26140 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
26150 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
26160 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
26170 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
26180 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
26190 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
261a0 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  ixShm **pp;     
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
261c0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
261d0 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
261e0 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
261f0 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
26200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26210 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
26220 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
26230 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69   pDbFd = (unixFi
26240 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
26250 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
26260 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
26270 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
26280 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
26290 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  de;..  assert( p
262a0 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
262b0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
262c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
262d0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
262e0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
262f0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
26300 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
26310 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
26320 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
26330 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
26340 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
26350 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
26360 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
26370 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
26380 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
26390 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
263a0 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
263b0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
263c0 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
263d0 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
263e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
263f0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
26400 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
26410 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
26420 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
26430 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
26440 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
26450 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
26460 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
26470 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
26480 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
26490 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
264a0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
264b0 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
264c0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
264d0 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
264e0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
264f0 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
26500 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  && pShmNode->h>=
26510 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  0 ){.      osUnl
26520 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  ink(pShmNode->zF
26530 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ilename);.    }.
26540 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65      unixShmPurge
26550 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75  (pDbFd);.  }.  u
26560 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
26570 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
26580 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a  E_OK;.}...#else.
26590 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
265a0 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
265b0 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20  ne unixShmLock  
265c0 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
265d0 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  xShmBarrier 0.# 
265e0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e  define unixShmUn
265f0 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
26600 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
26610 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69  _OMIT_WAL */..#i
26620 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
26630 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49  P_SIZE>0./*.** I
26640 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  f it is currentl
26650 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c  y memory mapped,
26660 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e   unmap file pFd.
26670 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26680 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
26690 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
266a0 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
266b0 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69  tchOut==0 );.  i
266c0 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  f( pFd->pMapRegi
266d0 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d  on ){.    osMunm
266e0 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  ap(pFd->pMapRegi
266f0 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  on, pFd->mmapSiz
26700 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46  eActual);.    pF
26710 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
26720 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  0;.    pFd->mmap
26730 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  Size = 0;.    pF
26740 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
26750 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  l = 0;.  }.}../*
26760 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
26770 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
26780 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
26790 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  g maintained by 
267a0 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70  file .** descrip
267b0 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20  tor pFd to nNew 
267c0 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74  bytes. Any exist
267d0 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64  ing mapping is d
267e0 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  iscarded..**.** 
267f0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
26800 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
26810 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
26820 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a  variables:.**.**
26830 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
26840 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20  pMapRegion.**   
26850 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61      unixFile.mma
26860 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75  pSize.**       u
26870 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
26880 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20  Actual.**.** If 
26890 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  unsuccessful, an
268a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
268b0 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c  s logged via sql
268c0 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a  ite3_log() and.*
268d0 2a 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69  * the three vari
268e0 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20  ables above are 
268f0 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20  zeroed. In this 
26900 63 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75  case SQLite shou
26910 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  ld.** continue a
26920 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
26930 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
26940 78 52 65 61 64 28 29 20 61 6e 64 20 78 57 72 69  xRead() and xWri
26950 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e  te().** methods.
26960 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26970 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20  unixRemapfile(. 
26980 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20   unixFile *pFd, 
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269a0 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
269b0 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tor object */.  
269c0 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20  i64 nNew        
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269e0 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70 70  /* Required mapp
269f0 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20  ing size */.){. 
26a00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
26a10 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e  r = "mmap";.  in
26a20 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20  t h = pFd->h;   
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a40 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
26a50 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62  iptor open on db
26a60 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70   file */.  u8 *p
26a70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64  Orig = (u8 *)pFd
26a80 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20  ->pMapRegion;   
26a90 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
26aa0 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69  rrent file mappi
26ab0 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69  ng */.  i64 nOri
26ac0 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  g = pFd->mmapSiz
26ad0 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20  eActual;     /* 
26ae0 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65  Size of pOrig re
26af0 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  gion in bytes */
26b00 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b  .  u8 *pNew = 0;
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
26b30 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69  ion of new mappi
26b40 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ng */.  int flag
26b50 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20  s = PROT_READ;  
26b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b70 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
26b80 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73   mmap() */..  as
26b90 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
26ba0 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  hOut==0 );.  ass
26bb0 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d  ert( nNew>pFd->m
26bc0 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  mapSize );.  ass
26bd0 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e  ert( nNew<=pFd->
26be0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20  mmapSizeMax );. 
26bf0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
26c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  );.  assert( pFd
26c10 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
26c20 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  >=pFd->mmapSize 
26c30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50  );.  assert( MAP
26c40 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23  _FAILED!=0 );..#
26c50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41  ifdef SQLITE_MMA
26c60 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20 69 66  P_READWRITE.  if
26c70 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
26c80 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
26c90 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20  NLY)==0 ) flags 
26ca0 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23  |= PROT_WRITE;.#
26cb0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 72  endif..  if( pOr
26cc0 69 67 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d  ig ){.#if HAVE_M
26cd0 52 45 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52  REMAP.    i64 nR
26ce0 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  euse = pFd->mmap
26cf0 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Size;.#else.    
26d00 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70  const int szSysp
26d10 61 67 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73  age = osGetpages
26d20 69 7a 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e  ize();.    i64 n
26d30 52 65 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d  Reuse = (pFd->mm
26d40 61 70 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73  apSize & ~(szSys
26d50 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66  page-1));.#endif
26d60 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20  .    u8 *pReq = 
26d70 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a  &pOrig[nReuse];.
26d80 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e  .    /* Unmap an
26d90 79 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 65  y pages of the e
26da0 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
26db0 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72  that cannot be r
26dc0 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  eused. */.    if
26dd0 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20  ( nReuse!=nOrig 
26de0 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  ){.      osMunma
26df0 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52  p(pReq, nOrig-nR
26e00 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  euse);.    }..#i
26e10 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20  f HAVE_MREMAP.  
26e20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61    pNew = osMrema
26e30 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c  p(pOrig, nReuse,
26e40 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41   nNew, MREMAP_MA
26e50 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72  YMOVE);.    zErr
26e60 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c   = "mremap";.#el
26e70 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  se.    pNew = os
26e80 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d  Mmap(pReq, nNew-
26e90 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d  nReuse, flags, M
26ea0 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52  AP_SHARED, h, nR
26eb0 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70  euse);.    if( p
26ec0 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20  New!=MAP_FAILED 
26ed0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  ){.      if( pNe
26ee0 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20  w!=pReq ){.     
26ef0 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77     osMunmap(pNew
26f00 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29  , nNew - nReuse)
26f10 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
26f20 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
26f30 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
26f40 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20  pOrig;.      }. 
26f50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
26f60 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20   /* The attempt 
26f70 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 65 78  to extend the ex
26f80 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66  isting mapping f
26f90 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20  ailed. Free it. 
26fa0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  */.    if( pNew=
26fb0 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70  =MAP_FAILED || p
26fc0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
26fd0 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20  osMunmap(pOrig, 
26fe0 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20  nReuse);.    }. 
26ff0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77   }..  /* If pNew
27000 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20   is still NULL, 
27010 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e  try to create an
27020 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61   entirely new ma
27030 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20  pping. */.  if( 
27040 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pNew==0 ){.    p
27050 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20  New = osMmap(0, 
27060 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50  nNew, flags, MAP
27070 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a  _SHARED, h, 0);.
27080 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d    }..  if( pNew=
27090 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
270a0 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
270b0 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75   nNew = 0;.    u
270c0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
270d0 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64  TE_OK, zErr, pFd
270e0 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f  ->zPath);..    /
270f0 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20  * If the mmap() 
27100 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73  above failed, as
27110 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75  sume that all su
27120 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20  bsequent mmap() 
27130 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c  calls.    ** wil
27140 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20  l probably fail 
27150 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74  too. Fall back t
27160 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57  o using xRead/xW
27170 72 69 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79  rite exclusively
27180 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
27190 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46  case.  */.    pF
271a0 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  d->mmapSizeMax =
271b0 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70   0;.  }.  pFd->p
271c0 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69  MapRegion = (voi
271d0 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d  d *)pNew;.  pFd-
271e0 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d  >mmapSize = pFd-
271f0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
27200 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = nNew;.}../*.**
27210 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72   Memory map or r
27220 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70  emap the file op
27230 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73  ened by file-des
27240 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20  criptor pFd (if 
27250 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
27260 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74  lready mapped, t
27270 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
27280 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20  ing is replaced 
27290 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c  by the new). Or,
272a0 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c   if .** there al
272b0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d  ready exists a m
272c0 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20  apping for this 
272d0 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
272e0 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75  are still .** ou
272f0 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
27300 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  () references to
27310 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69   it, this functi
27320 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
27330 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
27340 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e  r nByte is non-n
27350 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74  egative, then it
27360 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65   is the requeste
27370 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68  d size of .** th
27380 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65  e mapping to cre
27390 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
273a0 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73  if nByte is less
273b0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
273c0 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
273d0 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
273e0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
273f0 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
27400 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
27410 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
27420 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
27430 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
27440 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
27450 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e  figured .** usin
27460 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  g SQLITE_FCNTL_M
27470 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68  MAP_LIMIT, which
27480 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e  ever is smaller.
27490 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
274a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
274b0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
274c0 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70  (even if the map
274d0 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72  ping is not.** r
274e0 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65  ecreated as a re
274f0 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64  sult of outstand
27500 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20  ing references) 
27510 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
27520 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  or.** code other
27530 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
27540 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  int unixMapfile(
27550 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69  unixFile *pFd, i
27560 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 36 34  64 nByte){.  i64
27570 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20   nMap = nByte;. 
27580 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
27590 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70  rt( nMap>=0 || p
275a0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
275b0 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e   );.  if( pFd->n
275c0 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74  FetchOut>0 ) ret
275d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
275e0 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a    if( nMap<0 ){.
275f0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
27600 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
27610 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
27620 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
27630 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73  */.    rc = osFs
27640 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61  tat(pFd->h, &sta
27650 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  tbuf);.    if( r
27660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27670 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27680 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
27690 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20  .    }.    nMap 
276a0 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  = statbuf.st_siz
276b0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61  e;.  }.  if( nMa
276c0 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  p>pFd->mmapSizeM
276d0 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d  ax ){.    nMap =
276e0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
276f0 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d  x;.  }..  if( nM
27700 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ap!=pFd->mmapSiz
27710 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 4d 61  e ){.    if( nMa
27720 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69  p>0 ){.      uni
27730 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20  xRemapfile(pFd, 
27740 6e 4d 61 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  nMap);.    }else
27750 7b 0a 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61  {.      unixUnma
27760 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20  pfile(pFd);.    
27770 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
27780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
27790 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
277a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
277b0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69  ../*.** If possi
277c0 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  ble, return a po
277d0 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69  inter to a mappi
277e0 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74  ng of file fd st
277f0 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74  arting at offset
27800 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61  .** iOff. The ma
27810 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61  pping must be va
27820 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74  lid for at least
27830 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a   nAmt bytes..**.
27840 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69  ** If such a poi
27850 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61  nter can be obta
27860 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69  ined, store it i
27870 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e  n *pp and return
27880 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
27890 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  r, if one cannot
278a0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
278b0 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f  curs, set *pp to
278c0 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51   0 and return SQ
278d0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61  LITE_OK..** Fina
278e0 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
278f0 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74   does occur, ret
27900 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
27910 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69  ror code. The fi
27920 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  nal.** value of 
27930 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64  *pp is undefined
27940 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
27950 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
27960 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72  ction does retur
27970 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65  n a pointer, the
27980 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65   caller must eve
27990 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65  ntually .** rele
279a0 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
279b0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e 69  e by calling uni
279c0 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73  xUnfetch()..*/.s
279d0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 65  tatic int unixFe
279e0 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
279f0 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
27a00 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a  int nAmt, void *
27a10 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *pp){.#if SQLITE
27a20 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
27a30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
27a40 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66   = (unixFile *)f
27a50 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
27a60 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
27a70 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  file */.#endif. 
27a80 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20 53   *pp = 0;..#if S
27a90 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
27aa0 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d  IZE>0.  if( pFd-
27ab0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29  >mmapSizeMax>0 )
27ac0 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70  {.    if( pFd->p
27ad0 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a  MapRegion==0 ){.
27ae0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 75        int rc = u
27af0 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64 2c 20  nixMapfile(pFd, 
27b00 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  -1);.      if( r
27b10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
27b20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
27b30 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61      if( pFd->mma
27b40 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41  pSize >= iOff+nA
27b50 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20  mt ){.      *pp 
27b60 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  = &((u8 *)pFd->p
27b70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
27b80 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65  ;.      pFd->nFe
27b90 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a  tchOut++;.    }.
27ba0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
27bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27bc0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ../*.** If the t
27bd0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
27be0 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
27bf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
27c00 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66  leases a .** ref
27c10 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20  erence obtained 
27c20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
27c30 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63 68 28  ll to unixFetch(
27c40 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
27c50 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
27c60 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
27c70 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
27c80 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
27c90 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
27ca0 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
27cb0 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69 78 46  sed to the unixF
27cc0 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f  etch() invocatio
27cd0 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  n. .**.** Or, if
27ce0 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
27cf0 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
27d00 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27d10 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
27d20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68  .** to inform th
27d30 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74  e VFS layer that
27d40 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50  , according to P
27d50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69  OSIX, any existi
27d60 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d  ng mapping .** m
27d70 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69  ay now be invali
27d80 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  d and should be 
27d90 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61  unmapped..*/.sta
27da0 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 66 65  tic int unixUnfe
27db0 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
27dc0 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
27dd0 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51  void *p){.#if SQ
27de0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
27df0 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20  ZE>0.  unixFile 
27e00 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  *pFd = (unixFile
27e10 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20   *)fd;   /* The 
27e20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
27e30 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 55 4e  ase file */.  UN
27e40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
27e50 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Off);..  /* If p
27e60 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65  ==0 (unmap the e
27e70 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e  ntire file) then
27e80 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   there must be n
27e90 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20  o outstanding . 
27ea0 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72   ** xFetch refer
27eb0 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21  ences. Or, if p!
27ec0 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69  =0 (meaning it i
27ed0 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65  s an xFetch refe
27ee0 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65  rence),.  ** the
27ef0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
27f00 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
27f10 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20  standing.  */.  
27f20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d  assert( (p==0)==
27f30 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  (pFd->nFetchOut=
27f40 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
27f50 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61  p!=0, it must ma
27f60 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c  tch the iOff val
27f70 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ue. */.  assert(
27f80 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75   p==0 || p==&((u
27f90 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
27fa0 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20  ion)[iOff] );.. 
27fb0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46   if( p ){.    pF
27fc0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a  d->nFetchOut--;.
27fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
27fe0 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  xUnmapfile(pFd);
27ff0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
28000 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d  pFd->nFetchOut>=
28010 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  0 );.#else.  UNU
28020 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
28030 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
28040 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53  METER(p);.  UNUS
28050 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66  ED_PARAMETER(iOf
28060 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  f);.#endif.  ret
28070 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28080 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
28090 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
280a0 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
280b0 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
280c0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
280d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
280e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
280f0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
28100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28110 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
28120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28160 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
28170 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
28180 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
28190 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
281a0 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
281b0 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
281c0 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
281d0 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
281e0 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
281f0 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
28200 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
28210 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
28220 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
28230 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
28240 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
28250 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28260 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
28270 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
28280 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
28290 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
282a0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
282b0 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
282c0 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
282d0 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
282e0 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
282f0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
28300 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
28310 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
28320 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
28330 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
28340 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
28350 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
28360 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
28370 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
28380 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
28390 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
283a0 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
283b0 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
283c0 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
283d0 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
283e0 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
283f0 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
28400 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
28410 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20 74 77  r-function F, tw
28420 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  o objects are cr
28430 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eated:.**.**    
28440 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e  (1) The real fin
28450 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der-function nam
28460 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a  ed "FImpt()"..**
28470 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e  .**    (2) A con
28480 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f  stant pointer to
28490 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
284a0 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a  amed just "F"..*
284b0 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  *.**.** A pointe
284c0 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74  r to the F point
284d0 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68  er is used as th
284e0 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65  e pAppData value
284f0 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65   for VFS.** obje
28500 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f  cts.  We have to
28510 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64   do this instead
28520 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70   of letting pApp
28530 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69  Data point.** di
28540 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69  rectly at the fi
28550 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69  nder-function si
28560 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72  nce C90 rules pr
28570 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a  event a void*.**
28580 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e   from be cast in
28590 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  to a function po
285a0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  inter..**.**.** 
285b0 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
285c0 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65   this macro gene
285d0 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74  rates two object
285e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20  s:.**.**   *  A 
285f0 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33  constant sqlite3
28600 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
28610 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74  ct call METHOD t
28620 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a  hat has locking.
28630 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20  **      methods 
28640 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
28650 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a  OCK, CKRESLOCK..
28660 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f  **.**   *  An I/
28670 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
28680 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
28690 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75  FINDER that retu
286a0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  rns a pointer.**
286b0 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54        to the MET
286c0 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  HOD object in th
286d0 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65  e previous bulle
286e0 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f  t..*/.#define IO
286f0 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 4d  METHODS(FINDER,M
28700 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e 2c 43 4c  ETHOD,VERSION,CL
28710 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c  OSE,LOCK,UNLOCK,
28720 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29 20 20  CKLOCK,SHMMAP)  
28730 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
28740 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
28750 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20  hods METHOD = { 
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28780 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20    \.   VERSION, 
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
287b0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287d0 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20   \.   CLOSE,    
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20    /* xClose */  
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20  \.   unixRead,  
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28840 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20   /* xRead */    
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28870 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20  .   unixWrite,  
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20  /* xWrite */    
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
288c0 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c     unixTruncate,
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
288e0 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20  * xTruncate */  
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28900 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28910 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20    unixSync,     
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28930 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20   xSync */       
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28950 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28960 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20   unixFileSize,  
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28980 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20  xFileSize */    
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
289b0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
289c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
289d0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
289e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289f0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55            \.   U
28a00 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  NLOCK,          
28a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
28a20 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  nlock */        
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a40 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b           \.   CK
28a50 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
28a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
28a70 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
28a80 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28a90 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28aa0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20  xFileControl,   
28ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
28ac0 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20  eControl */     
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28af0 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
28b00 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
28b10 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  orSize */       
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44        \.   unixD
28b40 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
28b50 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63  tics,  /* xDevic
28b60 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f  eCapabilities */
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b80 20 20 20 20 20 5c 0a 20 20 20 53 48 4d 4d 41 50       \.   SHMMAP
28b90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28ba0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
28bb0 20 2a 2f 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 20 20 20 20                  
28bd0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
28be0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
28bf0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
28c00 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42     \.   unixShmB
28c30 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
28c40 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
28c50 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  er */           
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e    \.   unixShmUn
28c80 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
28c90 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
28ca0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cc0 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68 2c   \.   unixFetch,
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ce0 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20 20    /* xFetch */  
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d10 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63 68  \.   unixUnfetch
28d20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28d30 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 20   /* xUnfetch */ 
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 20 20 20 20 20 20 20 20 5c                 \
28d60 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28db0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
28dc0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
28dd0 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f  *FINDER##Impl(co
28de0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69  nst char *z, uni
28df0 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20  xFile *p){   \. 
28e00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
28e10 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52  R(z); UNUSED_PAR
28e20 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20  AMETER(p);      
28e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e40 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28e50 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20  return &METHOD; 
28e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e70 20 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 20 20 20 20 20 20 20 20 5c 0a 7d 20 20             \.}  
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 20 20 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 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
28ef0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
28f00 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63  _io_methods *(*c
28f10 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e  onst FINDER)(con
28f20 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
28f30 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d  e *p)    \.    =
28f40 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a   FINDER##Impl;..
28f50 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61  /*.** Here are a
28f60 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ll of the sqlite
28f70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
28f80 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66  ects for each of
28f90 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20   the.** locking 
28fa0 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e  strategies.  Fun
28fb0 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75  ctions that retu
28fc0 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  rn pointers to t
28fd0 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20  hese methods.** 
28fe0 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64  are also created
28ff0 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ..*/.IOMETHODS(.
29000 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c    posixIoFinder,
29010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29020 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
29030 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f  ame */.  posixIo
29040 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
29050 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
29060 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
29070 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20  name */.  3,    
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29090 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
290a0 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72  mory and mmap ar
290b0 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75  e enabled */.  u
290c0 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
290d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
290e0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
290f0 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
29100 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29110 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
29120 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ixUnlock,       
29130 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
29140 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
29150 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
29160 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65  Lock,    /* xChe
29170 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
29180 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 53  ethod */.  unixS
29190 68 6d 4d 61 70 20 20 20 20 20 20 20 20 20 20 20  hmMap           
291a0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
291b0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
291c0 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49  THODS(.  nolockI
291d0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
291e0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
291f0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
29200 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  nolockIoMethods,
29210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
29220 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29230 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
29240 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
29250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
29260 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
29270 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c  isabled */.  nol
29280 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
29290 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
292a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
292b0 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
292c0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
292d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
292e0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
292f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29300 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
29310 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
29320 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68 65 63 6b  Lock,  /* xCheck
29330 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29340 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29360 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
29370 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
29380 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  ODS(.  dotlockIo
29390 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
293a0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
293b0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f  ion name */.  do
293c0 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  tlockIoMethods, 
293d0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
293e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
293f0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
29400 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29410 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
29420 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
29430 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  abled */.  dotlo
29440 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
29450 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29460 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
29470 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
29480 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29490 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
294a0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
294b0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
294c0 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
294d0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
294e0 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63 6b 52 65  ock, /* xCheckRe
294f0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29500 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29520 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
29530 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c  od */.)..#if SQL
29540 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
29550 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
29560 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
29570 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
29580 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
29590 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
295a0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
295b0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
295c0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
295d0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
295e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295f0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
29600 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
29610 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  bled */.  flockC
29620 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
29630 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
29640 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c  thod */.  flockL
29650 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29660 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
29670 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  hod */.  flockUn
29680 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
29690 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
296a0 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  thod */.  flockC
296b0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
296c0 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ,   /* xCheckRes
296d0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
296e0 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29700 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
29710 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
29720 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  if OS_VXWORKS.IO
29730 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f  METHODS(.  semIo
29740 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
29750 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
29760 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
29770 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20    semIoMethods, 
29780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29790 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
297a0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
297b0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
297d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
297e0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73   disabled */.  s
297f0 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  emXClose,       
29800 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29810 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  se method */.  s
29820 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  emXLock,        
29830 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29840 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
29850 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  mXUnlock,       
29860 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
29870 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
29880 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65 64  emXCheckReserved
29890 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65  Lock,    /* xChe
298a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
298b0 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298d0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
298e0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
298f0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
29900 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
29910 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
29920 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
29930 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64  ODS(.  afpIoFind
29940 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
29950 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
29960 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66  ion name */.  af
29970 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  pIoMethods,     
29980 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
29990 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
299a0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
299b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
299c0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
299d0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
299e0 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c  abled */.  afpCl
299f0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29a00 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29a10 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f  ethod */.  afpLo
29a20 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29a30 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29a40 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c  thod */.  afpUnl
29a50 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29a60 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
29a70 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68  ethod */.  afpCh
29a80 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
29a90 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
29aa0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29ab0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
29ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ad0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
29ae0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
29af0 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
29b00 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69  locking method i
29b10 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f  s a "super-metho
29b20 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  d" in the sense 
29b30 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73  that it.** opens
29b40 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20   secondary file 
29b50 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
29b60 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f  the conch and lo
29b70 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20  ck files and.** 
29b80 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64  it uses proxy, d
29b90 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e  ot-file, AFP, an
29ba0 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  d flock() lockin
29bb0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f  g methods on tho
29bc0 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20  se.** secondary 
29bd0 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73  files.  For this
29be0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
29bf0 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
29c00 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c  ments.** proxy l
29c10 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65  ocking is locate
29c20 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64  d much further d
29c30 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  own in the file.
29c40 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a    But we need.**
29c50 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
29c60 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69   define the sqli
29c70 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
29c80 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  nd finder functi
29c90 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20  on.** for proxy 
29ca0 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53  locking here.  S
29cb0 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63  o we forward dec
29cc0 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74  lare the I/O met
29cd0 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  hods..*/.#if def
29ce0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
29cf0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
29d00 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
29d10 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
29d20 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
29d30 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
29d40 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
29d50 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
29d60 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
29d70 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
29d80 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
29d90 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
29da0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
29db0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a  ite3_file*, int*
29dc0 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  );.IOMETHODS(.  
29dd0 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20  proxyIoFinder,  
29de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
29df0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
29e00 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65  e */.  proxyIoMe
29e10 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
29e20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
29e30 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
29e40 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
29e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e60 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
29e70 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
29e80 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20  /.  proxyClose, 
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ea0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
29eb0 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20  /.  proxyLock,  
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ed0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
29ee0 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20  .  proxyUnlock, 
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f00 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
29f10 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65  /.  proxyCheckRe
29f20 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a  servedLock,   /*
29f30 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29f40 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29f50 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
29f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
29f70 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
29f80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20  .#endif../* nfs 
29f90 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e  lockd on OSX 10.
29fa0 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72  3+ doesn't clear
29fb0 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65   write locks whe
29fc0 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
29fd0 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69   set */.#if defi
29fe0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
29ff0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2a000 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
2a010 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f  METHODS(.  nfsIo
2a020 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2a030 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2a040 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2a050 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c  .  nfsIoMethods,
2a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a070 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a080 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2a090 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0b0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2a0c0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2a0d0 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a0f0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
2a100 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
2a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a120 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2a130 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20  .  nfsUnlock,   
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a150 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2a160 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
2a170 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
2a180 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2a190 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2a1a0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a1c0 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2a1d0 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
2a1e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2a1f0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2a200 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2a210 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
2a220 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
2a230 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
2a240 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
2a250 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
2a260 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
2a270 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
2a280 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
2a290 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
2a2a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
2a2b0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
2a2c0 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
2a2d0 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
2a2e0 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20  s is for MacOSX 
2a2f0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
2a300 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2a310 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
2a320 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
2a330 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
2a340 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
2a350 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2a360 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
2a370 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
2a380 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69        /* open fi
2a390 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
2a3a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a3b0 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
2a3c0 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70  onst struct Mapp
2a3d0 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ing {.    const 
2a3e0 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65  char *zFilesyste
2a3f0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2a400 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79  /* Filesystem ty
2a410 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63  pe name */.    c
2a420 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2a430 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
2a440 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69  s;   /* Appropri
2a450 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ate locking meth
2a460 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d  od */.  } aMap[]
2a470 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22   = {.    { "hfs"
2a480 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
2a490 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75  hods },.    { "u
2a4a0 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
2a4b0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2a4c0 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49   "afpfs",  &afpI
2a4d0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2a4e0 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70  { "smbfs",  &afp
2a4f0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2a500 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f   { "webdav", &no
2a510 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  lockIoMethods },
2a520 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20  .    { 0, 0 }.  
2a530 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
2a540 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
2a550 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  fo;.  struct flo
2a560 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
2a570 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
2a580 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
2a590 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
2a5a0 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
2a5b0 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
2a5c0 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
2a5d0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
2a5e0 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
2a5f0 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
2a600 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2a610 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
2a620 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73  fs(filePath, &fs
2a630 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20  Info) != -1 ){. 
2a640 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f     if( fsInfo.f_
2a650 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e  flags & MNT_RDON
2a660 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LY ){.      retu
2a670 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2a680 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ods;.    }.    f
2a690 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e  or(i=0; aMap[i].
2a6a0 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b  zFilesystem; i++
2a6b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
2a6c0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
2a6d0 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d  ypename, aMap[i]
2a6e0 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30  .zFilesystem)==0
2a6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2a700 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68  rn aMap[i].pMeth
2a710 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ods;.      }.   
2a720 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66   }.  }..  /* Def
2a730 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c  ault case. Handl
2a740 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  es, amongst othe
2a750 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20  rs, "nfs"..  ** 
2a760 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20  Test byte-range 
2a770 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c  lock using fcntl
2a780 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20  (). If the call 
2a790 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20  succeeds, .  ** 
2a7a0 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
2a7b0 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
2a7c0 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65  orts POSIX style
2a7d0 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20   locks. .  */.  
2a7e0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
2a7f0 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
2a800 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
2a810 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
2a820 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
2a830 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
2a840 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
2a850 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
2a860 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
2a870 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
2a880 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2a890 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2a8a0 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "nfs")==0 ){.   
2a8b0 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f     return &nfsIo
2a8c0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65  Methods;.    } e
2a8d0 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lse {.      retu
2a8e0 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
2a8f0 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ds;.    }.  }els
2a900 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64  e{.    return &d
2a910 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  otlockIoMethods;
2a920 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
2a930 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2a940 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
2a950 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
2a960 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
2a970 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
2a980 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
2a990 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  pl;..#endif /* d
2a9a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2a9b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2a9c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a9d0 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f   */..#if OS_VXWO
2a9e0 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 22  RKS./*.** This "
2a9f0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
2aa00 20 66 6f 72 20 56 78 57 6f 72 6b 73 20 63 68 65   for VxWorks che
2aa10 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70 6f  cks to see if po
2aa20 73 69 78 20 61 64 76 69 73 6f 72 79 0a 2a 2a 20  six advisory.** 
2aa30 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 2e 20 20  locking works.  
2aa40 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e  If it does, then
2aa50 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69 73   that is what is
2aa60 20 75 73 65 64 2e 20 20 49 66 20 69 74 20 64 6f   used.  If it do
2aa70 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b 2c 20  es not.** work, 
2aa80 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b 20 74 6f  then fallback to
2aa90 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
2aaa0 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61   locking..*/.sta
2aab0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2aac0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 76 78  3_io_methods *vx
2aad0 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70  worksIoFinderImp
2aae0 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
2aaf0 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
2ab00 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2ab10 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2ab20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
2ab30 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
2ab40 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
2ab50 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
2ab60 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
2ab70 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
2ab80 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
2ab90 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
2aba0 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
2abb0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
2abc0 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
2abd0 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
2abe0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
2abf0 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
2ac00 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2ac10 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ods;.  }..  /* T
2ac20 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69  est if fcntl() i
2ac30 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20  s supported and 
2ac40 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20  use POSIX style 
2ac50 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65  locks..  ** Othe
2ac60 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20  rwise fall back 
2ac70 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  to the named sem
2ac80 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20  aphore method.. 
2ac90 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
2aca0 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
2acb0 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
2acc0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
2acd0 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
2ace0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
2acf0 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
2ad00 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
2ad10 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
2ad20 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
2ad30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f  {.    return &po
2ad40 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
2ad50 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2ad60 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b  n &semIoMethods;
2ad70 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
2ad80 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2ad90 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
2ada0 73 74 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64  st vxworksIoFind
2adb0 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
2adc0 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 76 78 77  unixFile*) = vxw
2add0 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c  orksIoFinderImpl
2ade0 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  ;..#endif /* OS_
2adf0 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a  VXWORKS */../*.*
2ae00 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79  * An abstract ty
2ae10 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72  pe for a pointer
2ae20 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74 68 6f 64   to an IO method
2ae30 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
2ae40 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e  :.*/.typedef con
2ae50 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2ae60 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f  thods *(*finder_
2ae70 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72  type)(const char
2ae80 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a  *,unixFile*);...
2ae90 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2aea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aeb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2aee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
2af00 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
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 0a 2a 2a 0a 2a  ***********.**.*
2af30 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
2af40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
2af50 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
2af60 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
2af70 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
2af80 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ect..*/../*.** I
2af90 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
2afa0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e  ntents of the un
2afb0 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2afc0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
2afd0 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  Id..*/.static in
2afe0 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  t fillInUnixFile
2aff0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2b000 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50  *pVfs,      /* P
2b010 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
2b020 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c  ject */.  int h,
2b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b040 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
2b050 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c  escriptor of fil
2b060 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
2b070 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
2b080 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
2b090 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
2b0a0 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
2b0b0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
2b0c0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2b0d0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2b0e0 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2b0f0 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46  d */.  int ctrlF
2b100 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
2b110 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55  * Zero or more U
2b120 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73  NIXFILE_* values
2b130 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
2b140 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b150 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
2b160 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
2b170 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
2b180 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
2b190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2b1a0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e  ssert( pNew->pIn
2b1b0 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20  ode==NULL );..  
2b1c0 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70  /* Usually the p
2b1d0 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68  ath zFilename sh
2b1e0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65  ould not be a re
2b1f0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
2b200 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74   The.  ** except
2b210 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e  ion is when open
2b220 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63  ing the proxy "c
2b230 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75  onch" file in bu
2b240 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69  ilds that.  ** i
2b250 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69  nclude the speci
2b260 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67  al Apple locking
2b270 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69   styles..  */.#i
2b280 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2b290 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2b2a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2b2b0 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46  YLE.  assert( zF
2b2c0 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
2b2d0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
2b2e0 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41  .    || pVfs->pA
2b2f0 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26  ppData==(void*)&
2b300 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2b310 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65   );.#else.  asse
2b320 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
2b330 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
2b340 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a  =='/' );.#endif.
2b350 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67  .  /* No locking
2b360 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f   occurs in tempo
2b370 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rary files */.  
2b380 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
2b390 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61  e!=0 || (ctrlFla
2b3a0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
2b3b0 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f  LOCK)!=0 );..  O
2b3c0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
2b3d0 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
2b3e0 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
2b3f0 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
2b400 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  ew->pVfs = pVfs;
2b410 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d  .  pNew->zPath =
2b420 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e   zFilename;.  pN
2b430 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20  ew->ctrlFlags = 
2b440 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 23  (u8)ctrlFlags;.#
2b450 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
2b460 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e 65 77  AP_SIZE>0.  pNew
2b470 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
2b480 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2b490 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64  fig.szMmap;.#end
2b4a0 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
2b4b0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63  _uri_boolean(((c
2b4c0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
2b4d0 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65  ILE_URI) ? zFile
2b4e0 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20  name : 0),.     
2b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b500 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51        "psow", SQ
2b510 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f  LITE_POWERSAFE_O
2b520 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20  VERWRITE) ){.   
2b530 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2b540 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f   |= UNIXFILE_PSO
2b550 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  W;.  }.  if( str
2b560 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  cmp(pVfs->zName,
2b570 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20  "unix-excl")==0 
2b580 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
2b590 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2b5a0 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69  LE_EXCL;.  }..#i
2b5b0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70  f OS_VXWORKS.  p
2b5c0 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72  New->pId = vxwor
2b5d0 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69  ksFindFileId(zFi
2b5e0 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  lename);.  if( p
2b5f0 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20  New->pId==0 ){. 
2b600 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2b610 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b  UNIXFILE_NOLOCK;
2b620 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2b630 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
2b640 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c  if..  if( ctrlFl
2b650 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
2b660 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f  OLOCK ){.    pLo
2b670 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
2b680 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2b690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
2b6a0 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
2b6b0 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
2b6c0 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
2b6d0 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
2b6e0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2b6f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2b700 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
2b710 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
2b720 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
2b730 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
2b740 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
2b750 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
2b760 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
2b770 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
2b780 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
2b790 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
2b7a0 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
2b7b0 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
2b7c0 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
2b7d0 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
2b7e0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2b7f0 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
2b800 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
2b810 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
2b820 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
2b830 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
2b840 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2b850 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2b860 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2b870 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
2b880 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
2b890 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
2b8a0 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
2b8b0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
2b8c0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2b8d0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2b8e0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
2b8f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b900 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
2b910 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 66  or occurred in f
2b920 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20  indInodeInfo(), 
2b930 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
2b940 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20  escriptor.      
2b950 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ** immediately, 
2b960 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67  before releasing
2b970 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64   the mutex. find
2b980 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20  InodeInfo() may 
2b990 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  fail.      ** in
2b9a0 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
2b9b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2b9c0 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74  *   (a) A call t
2b9d0 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64  o fstat() failed
2b9e0 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29  ..      **   (b)
2b9f0 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64   A malloc failed
2ba00 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2ba10 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29   ** Scenario (b)
2ba20 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20   may only occur 
2ba30 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  if the process i
2ba40 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68  s holding no oth
2ba50 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
2ba60 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
2ba70 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2ba80 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  le. If there wer
2ba90 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20  e other file.   
2baa0 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
2bab0 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  s on this file, 
2bac0 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77  then no malloc w
2bad0 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64  ould be required
2bae0 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e   by.      ** fin
2baf0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66  dInodeInfo(). If
2bb00 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
2bb10 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73  e, it is quite s
2bb20 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20  afe to close.   
2bb30 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d     ** handle h -
2bb40 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
2bb50 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73  teed that no pos
2bb60 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65  ix locks will be
2bb70 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20   released.      
2bb80 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a  ** by doing so..
2bb90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2bba0 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61  * If scenario (a
2bbb0 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72  ) caused the err
2bbc0 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61  or then things a
2bbd0 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20  re not so safe. 
2bbe0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  The.      ** imp
2bbf0 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e  licit assumption
2bc00 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66   here is that if
2bc10 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20   fstat() fails, 
2bc20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20  things are in.  
2bc30 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20      ** such bad 
2bc40 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70  shape that dropp
2bc50 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77  ing a lock or tw
2bc60 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  o doesn't matter
2bc70 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   much..      */.
2bc80 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2bc90 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2bca0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d  NE__);.      h =
2bcb0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75   -1;.    }.    u
2bcc0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2bcd0 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
2bce0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2bcf0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2bd00 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c  (__APPLE__).  el
2bd10 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2bd20 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65  tyle == &afpIoMe
2bd30 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2bd40 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  AFP locking uses
2bd50 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2bd60 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2bd70 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2bd80 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
2bd90 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  ngContext..    *
2bda0 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67  /.    afpLocking
2bdb0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
2bdc0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2bdd0 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
2bde0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
2bdf0 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  4( sizeof(*pCtx)
2be00 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
2be10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2be20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2be30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2be40 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
2be50 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
2be60 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
2be70 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
2be80 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63  sed.      ** acc
2be90 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72  ording to requir
2bea0 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53  ement F11141.  S
2beb0 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  o we do not need
2bec0 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   to make a.     
2bed0 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
2bee0 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
2bef0 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
2bf00 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
2bf10 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65     pCtx->reserve
2bf20 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61  d = 0;.      sra
2bf30 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
2bf40 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2bf50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  );.      rc = fi
2bf60 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2bf70 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2bf80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2bf90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bfa0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bfb0 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  e(pNew->lockingC
2bfc0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
2bfd0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2bfe0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2bff0 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
2c000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c010 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2c020 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
2c030 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
2c040 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2c050 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
2c060 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2c070 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
2c080 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2c090 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2c0a0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
2c0b0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
2c0c0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
2c0d0 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
2c0e0 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
2c0f0 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
2c100 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74  name;.    assert
2c110 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29  ( zFilename!=0 )
2c120 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20  ;.    nFilename 
2c130 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46  = (int)strlen(zF
2c140 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20  ilename) + 6;.  
2c150 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63    zLockFile = (c
2c160 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
2c170 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e 61 6d 65  lloc64(nFilename
2c180 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b  );.    if( zLock
2c190 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
2c1a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2c1b0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
2c1c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2c1d0 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
2c1e0 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
2c1f0 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
2c200 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2c210 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
2c220 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
2c230 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
2c240 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
2c250 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
2c260 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
2c270 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
2c280 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
2c290 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2c2a0 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2c2b0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
2c2c0 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
2c2d0 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
2c2e0 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
2c2f0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2c300 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
2c310 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
2c320 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
2c330 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
2c340 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
2c350 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d  w->pInode->pSem=
2c360 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  =NULL) ){.      
2c370 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d  char *zSemName =
2c380 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
2c390 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  SemName;.      i
2c3a0 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt n;.      sqli
2c3b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
2c3c0 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e  _PATHNAME, zSemN
2c3d0 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a  ame, "/%s.sem",.
2c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64         pNew->pId
2c400 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
2c410 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d  );.      for( n=
2c420 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20  1; zSemName[n]; 
2c430 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66  n++ ).        if
2c440 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27  ( zSemName[n]=='
2c450 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  /' ) zSemName[n]
2c460 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e   = '_';.      pN
2c470 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
2c480 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d   = sem_open(zSem
2c490 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30  Name, O_CREAT, 0
2c4a0 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  666, 1);.      i
2c4b0 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  f( pNew->pInode-
2c4c0 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49  >pSem == SEM_FAI
2c4d0 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LED ){.        r
2c4e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2c4f0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2c500 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
2c510 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
2c520 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
2c530 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2c540 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
2c550 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
2c560 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f  New, 0);.#if OS_
2c570 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
2c580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c590 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
2c5a0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2c5b0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2c5c0 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f     h = -1;.    o
2c5d0 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d  sUnlink(zFilenam
2c5e0 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74  e);.    pNew->ct
2c5f0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2c600 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a  ILE_DELETE;.  }.
2c610 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
2c620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c630 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62    if( h>=0 ) rob
2c640 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2c650 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2c660 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
2c670 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b  >pMethod = pLock
2c680 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70  ingStyle;.    Op
2c690 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
2c6a0 20 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28     verifyDbFile(
2c6b0 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pNew);.  }.  ret
2c6c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2c6d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
2c6e0 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20   of a directory 
2c6f0 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20  in which to put 
2c700 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
2c710 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
2c720 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  le temporary fil
2c730 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20  e directory can 
2c740 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
2c750 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
2c760 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69   const char *uni
2c770 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69  xTempFileDir(voi
2c780 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
2c790 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
2c7a0 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20  ] = {.     0,.  
2c7b0 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20     0,.     0,.  
2c7c0 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20     "/var/tmp",. 
2c7d0 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a      "/usr/tmp",.
2c7e0 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
2c7f0 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69    0        /* Li
2c800 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f  st terminator */
2c810 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
2c820 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2c830 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
2c840 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
2c850 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20  0;..  azDirs[0] 
2c860 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  = sqlite3_temp_d
2c870 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 28 20  irectory;.  if( 
2c880 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44  !azDirs[1] ) azD
2c890 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28  irs[1] = getenv(
2c8a0 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29  "SQLITE_TMPDIR")
2c8b0 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b  ;.  if( !azDirs[
2c8c0 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d  2] ) azDirs[2] =
2c8d0 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
2c8e0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2c8f0 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
2c900 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
2c910 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b  ; zDir=azDirs[i+
2c920 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69  +]){.    if( zDi
2c930 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  r==0 ) continue;
2c940 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28  .    if( osStat(
2c950 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f  zDir, &buf) ) co
2c960 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2c970 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f  !S_ISDIR(buf.st_
2c980 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  mode) ) continue
2c990 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63 65  ;.    if( osAcce
2c9a0 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63  ss(zDir, 07) ) c
2c9b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65  ontinue;.    bre
2c9c0 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
2c9d0 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zDir;.}../*.** 
2c9e0 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
2c9f0 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
2ca00 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
2ca10 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a   be allocated.**
2ca20 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
2ca30 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74  process and must
2ca40 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
2ca50 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a  o hold at least.
2ca60 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  ** pVfs->mxPathn
2ca70 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  ame bytes..*/.st
2ca80 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
2ca90 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
2caa0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2cab0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
2cac0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
2cad0 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
2cae0 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
2caf0 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
2cb00 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
2cb10 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
2cb20 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e  123456789";.  un
2cb30 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b  signed int i, j;
2cb40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2cb50 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  Dir;..  /* It's 
2cb60 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2cb70 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2cb80 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2cb90 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2cba0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2cbb0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2cbc0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2cbd0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2cbe0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2cbf0 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
2cc00 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
2cc10 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
2cc20 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72  IOERR );..  zDir
2cc30 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44   = unixTempFileD
2cc40 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72  ir();.  if( zDir
2cc50 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22  ==0 ) zDir = "."
2cc60 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
2cc70 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
2cc80 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
2cc90 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
2cca0 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a  porary file .  *
2ccb0 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73  * name. If it is
2ccc0 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
2ccd0 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a  ITE_ERROR..  */.
2cce0 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44    if( (strlen(zD
2ccf0 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c  ir) + strlen(SQL
2cd00 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
2cd10 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 28  EFIX) + 18) >= (
2cd20 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20  size_t)nBuf ){. 
2cd30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cd40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64  _ERROR;.  }..  d
2cd50 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
2cd60 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c  nprintf(nBuf-18,
2cd70 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49   zBuf, "%s/"SQLI
2cd80 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
2cd90 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  FIX, zDir);.    
2cda0 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  j = (int)strlen(
2cdb0 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  zBuf);.    sqlit
2cdc0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35  e3_randomness(15
2cdd0 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20  , &zBuf[j]);.   
2cde0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
2cdf0 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  i++, j++){.     
2ce00 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
2ce10 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
2ce20 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
2ce30 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
2ce40 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  )-1) ];.    }.  
2ce50 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
2ce60 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30     zBuf[j+1] = 0
2ce70 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63  ;.  }while( osAc
2ce80 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20  cess(zBuf,0)==0 
2ce90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2cea0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
2ceb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2cec0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
2ced0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
2cee0 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f  /*.** Routine to
2cef0 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69   transform a uni
2cf00 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f  xFile into a pro
2cf10 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46  xy-locking unixF
2cf20 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ile..** Implemen
2cf30 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72  tation in the pr
2cf40 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f  oxy-lock divisio
2cf50 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75  n, but used by u
2cf60 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20  nixOpen().** if 
2cf70 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2cf80 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64  OXY_LOCKING is d
2cf90 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
2cfa0 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73  c int proxyTrans
2cfb0 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69  formUnixFile(uni
2cfc0 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68  xFile*, const ch
2cfd0 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ar*);.#endif../*
2cfe0 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
2cff0 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
2d000 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61  scriptor that wa
2d010 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
2d020 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
2d030 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
2d040 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   or master-journ
2d050 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66  al file) identif
2d060 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a  ied by pathname.
2d070 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51  ** zPath with SQ
2d080 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
2d090 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f  ags matching tho
2d0a0 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
2d0b0 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
2d0c0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
2d0d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68  tion..**.** Such
2d0e0 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
2d0f0 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20  or may exist if 
2d100 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2d110 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64  ction was closed
2d120 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f  .** but the asso
2d130 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63  ciated file desc
2d140 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74  riptor could not
2d150 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75   be closed becau
2d160 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  se some.** other
2d170 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2d180 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
2d190 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e  e file is holdin
2d1a0 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a  g a file-lock..*
2d1b0 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65  * Refer to comme
2d1c0 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43  nts in the unixC
2d1d0 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  lose() function 
2d1e0 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20  and the lengthy 
2d1f0 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72  comment.** descr
2d200 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76  ibing "Posix Adv
2d210 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61  isory Locking" a
2d220 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
2d230 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a  his file for .**
2d240 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73   further details
2d250 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23  . Also, ticket #
2d260 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  4018..**.** If a
2d270 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64   suitable file d
2d280 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75  escriptor is fou
2d290 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72  nd, then it is r
2d2a0 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a  eturned. If no.*
2d2b0 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63  * such file desc
2d2c0 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65  riptor is locate
2d2d0 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
2d2e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69  d..*/.static Uni
2d2f0 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52  xUnusedFd *findR
2d300 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20  eusableFd(const 
2d310 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
2d320 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55   flags){.  UnixU
2d330 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
2d340 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e   = 0;..  /* Do n
2d350 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e  ot search for an
2d360 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
2d370 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72  criptor on vxwor
2d380 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a  ks. Not because.
2d390 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75    ** vxworks wou
2d3a0 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66  ld not benefit f
2d3b0 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28  rom the change (
2d3c0 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20  it might, we're 
2d3d0 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20  not sure),.  ** 
2d3e0 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77  but because no w
2d3f0 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73  ay to test it is
2d400 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
2d410 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74  able. It is bett
2d420 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  er .  ** not to 
2d430 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78  risk breaking vx
2d440 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f  works support fo
2d450 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75  r the sake of su
2d460 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20  ch an obscure . 
2d470 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f   ** feature.  */
2d480 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  .#if !OS_VXWORKS
2d490 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
2d4a0 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
2d4b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
2d4c0 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c  ts of stat() cal
2d4d0 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61  l */..  /* A sta
2d4e0 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69  t() call may fai
2d4f0 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65  l for various re
2d500 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68  asons. If this h
2d510 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20  appens, it is.  
2d520 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ** almost certai
2d530 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29  n that an open()
2d540 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d   call on the sam
2d550 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f  e path will also
2d560 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20   fail..  ** For 
2d570 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20  this reason, if 
2d580 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2d590 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61  in the stat() ca
2d5a0 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20  ll here, it is. 
2d5b0 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   ** ignored and 
2d5c0 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  -1 is returned. 
2d5d0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
2d5e0 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  try to open a ne
2d5f0 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63  w file.  ** desc
2d600 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61  riptor on the sa
2d610 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61  me path, fail, a
2d620 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  nd return an err
2d630 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20  or to SQLite..  
2d640 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20  **.  ** Even if 
2d650 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65  a subsequent ope
2d660 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75  n() call does su
2d670 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65  cceed, the conse
2d680 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20  quences of.  ** 
2d690 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f  not searching fo
2d6a0 72 20 61 20 72 65 75 73 61 62 6c 65 20 66 69 6c  r a reusable fil
2d6b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
2d6c0 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20   not dire.  */. 
2d6d0 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
2d6e0 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
2d6f0 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
2d700 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20  fo *pInode;..   
2d710 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2d720 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  );.    pInode = 
2d730 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  inodeList;.    w
2d740 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
2d750 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  (pInode->fileId.
2d760 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
2d770 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
2d780 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65         || pInode
2d790 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53  ->fileId.ino!=sS
2d7a0 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20  tat.st_ino) ){. 
2d7b0 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70        pInode = p
2d7c0 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
2d7d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f    }.    if( pIno
2d7e0 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78  de ){.      Unix
2d7f0 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20  UnusedFd **pp;. 
2d800 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e       for(pp=&pIn
2d810 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70  ode->pUnused; *p
2d820 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67  p && (*pp)->flag
2d830 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28  s!=flags; pp=&((
2d840 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20  *pp)->pNext));. 
2d850 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a       pUnused = *
2d860 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55  pp;.      if( pU
2d870 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
2d880 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e   *pp = pUnused->
2d890 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2d8a0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
2d8b0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
2d8c0 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21  endif    /* if !
2d8d0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20  OS_VXWORKS */.  
2d8e0 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a  return pUnused;.
2d8f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2d900 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2d910 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74   by unixOpen() t
2d920 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
2d930 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73  unix permissions
2d940 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65  .** to create ne
2d950 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66  w files with. If
2d960 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2d970 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
2d980 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
2d990 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74  and a value suit
2d9a0 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67  able for passing
2d9b0 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
2d9c0 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32  gument to open(2
2d9d0 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ) is.** written 
2d9e0 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e  to *pMode. If an
2d9f0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2da00 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
2da10 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
2da20 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
2da30 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69  alue of *pMode i
2da40 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a  s not modified..
2da50 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61  **.** In most ca
2da60 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ses, this routin
2da70 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  e sets *pMode to
2da80 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62   0, which will b
2da90 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69  ecome.** an indi
2daa0 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74  cation to robust
2dab0 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61 74  _open() to creat
2dac0 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e 67  e the file using
2dad0 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55  .** SQLITE_DEFAU
2dae0 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
2daf0 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79 20  ONS adjusted by 
2db00 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75  the umask..** Bu
2db10 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62 65  t if the file be
2db20 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20  ing opened is a 
2db30 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20 6a  WAL or regular j
2db40 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
2db50 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  n .** this funct
2db60 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65 20  ion queries the 
2db70 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
2db80 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
2db90 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65  on the .** corre
2dba0 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73  sponding databas
2dbb0 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73 20  e file and sets 
2dbc0 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20 76  *pMode to this v
2dbd0 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20 0a  alue. Whenever .
2dbe0 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c  ** possible, WAL
2dbf0 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
2dc00 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 75  es are created u
2dc10 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70 65  sing the same pe
2dc20 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73  rmissions .** as
2dc30 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
2dc40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2dc50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49  *.** If the SQLI
2dc60 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
2dc70 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  MES option is en
2dc80 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  abled, then the.
2dc90 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  ** original file
2dca0 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61  name is unavaila
2dcb0 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41  ble.  But 8_3_NA
2dcc0 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  MES is only used
2dcd0 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65   for.** FAT file
2dce0 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72 6d  systems and perm
2dcf0 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d  issions do not m
2dd00 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f 20  atter there, so 
2dd10 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65 20  just use.** the 
2dd20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  default permissi
2dd30 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ons..*/.static i
2dd40 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c  nt findCreateFil
2dd50 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  eMode(.  const c
2dd60 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
2dd70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
2dd80 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62   of file (possib
2dd90 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74 65  ly) being create
2dda0 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  d */.  int flags
2ddb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ddc0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
2ddd0 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61 72  passed as 4th ar
2dde0 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28  gument to xOpen(
2ddf0 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70  ) */.  mode_t *p
2de00 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
2de10 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
2de20 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70  ermissions to op
2de30 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  en file with */.
2de40 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20    uid_t *pUid,  
2de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de60 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f    /* OUT: uid to
2de70 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
2de80 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69   */.  gid_t *pGi
2de90 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
2dea0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69        /* OUT: gi
2deb0 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
2dec0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
2ded0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2def0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2df00 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a   *pMode = 0;.  *
2df10 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69  pUid = 0;.  *pGi
2df20 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c 61  d = 0;.  if( fla
2df30 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
2df40 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
2df50 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
2df60 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b  ){.    char zDb[
2df70 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
2df80 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2df90 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
2dfa0 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
2dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
2dfd0 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20  id bytes in zDb 
2dfe0 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
2dff0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
2e000 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
2e010 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
2e020 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2e030 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20    /* zPath is a 
2e040 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72  path to a WAL or
2e050 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
2e060 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2e070 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a  ck derives.    *
2e080 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  * the path to th
2e090 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
2e0a0 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20  abase file from 
2e0b0 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63  zPath. This bloc
2e0c0 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a  k handles.    **
2e0d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e   the following n
2e0e0 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  aming convention
2e0f0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2e100 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2e110 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a  -journal".    **
2e120 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2e130 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  -wal".    **   "
2e140 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
2e150 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  rnalNN".    **  
2e160 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
2e170 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20  alNN".    **.   
2e180 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20   ** where NN is 
2e190 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  a decimal number
2e1a0 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
2e1b0 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
2e1c0 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
2e1d0 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
2e1e0 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
2e1f0 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
2e200 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
2e210 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53 51   - 1; .#ifdef SQ
2e220 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
2e230 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65 28  NAMES.    while(
2e240 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69 74 65   nDb>0 && sqlite
2e250 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e  3Isalnum(zPath[n
2e260 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20 20  Db]) ) nDb--;.  
2e270 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20    if( nDb==0 || 
2e280 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
2e290 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2e2a0 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77 68  OK;.#else.    wh
2e2b0 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21  ile( zPath[nDb]!
2e2c0 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61 73  ='-' ){.      as
2e2d0 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20  sert( nDb>0 );. 
2e2e0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50 61       assert( zPa
2e2f0 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29 3b  th[nDb]!='\n' );
2e300 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20  .      nDb--;.  
2e310 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d    }.#endif.    m
2e320 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68  emcpy(zDb, zPath
2e330 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b  , nDb);.    zDb[
2e340 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  nDb] = '\0';..  
2e350 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
2e360 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  zDb, &sStat) ){.
2e370 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73        *pMode = s
2e380 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30  Stat.st_mode & 0
2e390 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55 69 64  777;.      *pUid
2e3a0 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64 3b   = sStat.st_uid;
2e3b0 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d 20 73  .      *pGid = s
2e3c0 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 20  Stat.st_gid;.   
2e3d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2e3e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
2e3f0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
2e400 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
2e410 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
2e420 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
2e430 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
2e440 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
2e460 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
2e470 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
2e480 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
2e490 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
2e4a0 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
2e4b0 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
2e4c0 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
2e4d0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
2e4e0 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
2e4f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
2e500 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
2e510 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
2e520 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
2e530 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
2e540 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
2e550 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
2e560 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
2e570 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
2e580 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
2e590 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
2e5a0 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
2e5b0 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
2e5c0 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
2e5d0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
2e5e0 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
2e5f0 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
2e600 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
2e610 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
2e620 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
2e630 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
2e640 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
2e650 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
2e660 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
2e670 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
2e680 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
2e690 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
2e6a0 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
2e6b0 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
2e6c0 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
2e6d0 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
2e6e0 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
2e6f0 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
2e700 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
2e710 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
2e720 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
2e730 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2e740 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
2e750 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2e760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
2e770 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
2e780 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
2e790 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
2e7a0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
2e7b0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
2e7c0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
2e7d0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
2e7e0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2e7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e800 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e810 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
2e820 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e840 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
2e850 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
2e860 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
2e870 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
2e880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2e890 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
2e8a0 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
2e8b0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
2e8c0 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
2e8d0 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
2e8e0 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
2e8f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2e900 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
2e910 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
2e920 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ) */.  int openF
2e930 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
2e940 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
2e950 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
2e960 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
2e970 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
2e980 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
2e990 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2e9a0 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
2e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9c0 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
2e9d0 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
2e9e0 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
2e9f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2ea00 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
2ea10 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
2ea20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
2ea30 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
2ea40 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f      /* UNIXFILE_
2ea50 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e  * flags */..  in
2ea60 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
2ea70 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2ea80 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
2ea90 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
2eaa0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
2eab0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2eac0 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
2ead0 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
2eae0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2eaf0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
2eb00 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
2eb10 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2eb20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2eb30 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
2eb40 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
2eb50 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
2eb60 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
2eb70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2eb80 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
2eb90 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
2eba0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2ebb0 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
2ebc0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
2ebd0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
2ebe0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2ebf0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73  OCKING_STYLE.  s
2ec00 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
2ec10 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  nfo;.#endif..  /
2ec20 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
2ec30 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66  master or main-f
2ec40 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69  ile journal, thi
2ec50 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
2ec60 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65  open.  ** a file
2ec70 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74  -descriptor on t
2ec80 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f  he directory too
2ec90 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
2eca0 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a   unixSync().  **
2ecb0 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64   is called the d
2ecc0 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
2ecd0 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
2ece0 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63   fsync()ed and c
2ecf0 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20  lose()d..  */.  
2ed00 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28 69  int syncDir = (i
2ed10 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
2ed20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
2ed30 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
2ed40 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
2ed50 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ed60 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
2ed70 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
2ed80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
2ed90 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61    ));..  /* If a
2eda0 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
2edb0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
2edc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2edd0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
2ede0 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
2edf0 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
2ee00 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
2ee10 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
2ee20 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
2ee30 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
2ee40 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e  THNAME+2];.  con
2ee50 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
2ee60 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68   zPath;..  /* Ch
2ee70 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
2ee80 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
2ee90 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
2eea0 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
2eeb0 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
2eec0 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
2eed0 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
2eee0 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
2eef0 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
2ef00 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
2ef10 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
2ef20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
2ef30 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
2ef40 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
2ef50 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
2ef60 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
2ef70 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
2ef80 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
2ef90 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
2efa0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
2efb0 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
2efc0 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
2efd0 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
2efe0 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
2eff0 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
2f000 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
2f010 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
2f020 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
2f030 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
2f040 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
2f050 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
2f060 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
2f070 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
2f080 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
2f090 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
2f0a0 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
2f0b0 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  er .  ** automat
2f0c0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
2f0d0 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
2f0e0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
2f0f0 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
2f100 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2f110 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2f120 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f130 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
2f140 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2f150 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2f160 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f170 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
2f180 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2f190 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2f1a0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2f1b0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
2f1c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
2f1d0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2f1e0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2f1f0 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
2f200 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
2f210 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
2f220 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
2f230 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
2f240 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
2f250 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
2f260 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
2f270 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2f280 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
2f290 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  B .       || eTy
2f2a0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2f2b0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
2f2c0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f2d0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
2f2e0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
2f2f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
2f300 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
2f310 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f320 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
2f330 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
2f340 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
2f350 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
2f360 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f370 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  _WAL.  );..  /* 
2f380 44 65 74 65 63 74 20 61 20 70 69 64 20 63 68 61  Detect a pid cha
2f390 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  nge and reset th
2f3a0 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69  e PRNG.  There i
2f3b0 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
2f3c0 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63  on.  ** here suc
2f3d0 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f  h that two or mo
2f3e0 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74  re threads all t
2f3f0 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61  rying to open da
2f400 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20  tabases at.  ** 
2f410 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74  the same instant
2f420 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74   might all reset
2f430 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20   the PRNG.  But 
2f440 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a  multiple resets.
2f450 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73    ** are harmles
2f460 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61  s..  */.  if( ra
2f470 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73 47  ndomnessPid!=osG
2f480 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20 20 20  etpid(0) ){.    
2f490 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20  randomnessPid = 
2f4a0 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20 20 20  osGetpid(0);.   
2f4b0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
2f4c0 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20  ess(0,0);.  }.. 
2f4d0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
2f4e0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
2f4f0 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53  ..  if( eType==S
2f500 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2f510 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e  DB ){.    UnixUn
2f520 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
2f530 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66  .    pUnused = f
2f540 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e  indReusableFd(zN
2f550 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ame, flags);.   
2f560 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
2f570 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73        fd = pUnus
2f580 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73  ed->fd;.    }els
2f590 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  e{.      pUnused
2f5a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2f5b0 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  c64(sizeof(*pUnu
2f5c0 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28  sed));.      if(
2f5d0 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
2f5e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f5f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2f600 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  }.    }.    p->p
2f610 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
2f620 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ;..    /* Databa
2f630 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
2f640 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
2f650 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
2f660 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55  are not.    ** U
2f670 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
2f680 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
2f690 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
2f6a0 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20  passed into.    
2f6b0 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
2f6c0 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20  arameter(). */. 
2f6d0 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67     assert( (flag
2f6e0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2f6f0 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74  URI) || zName[st
2f700 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d  rlen(zName)+1]==
2f710 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66  0 );..  }else if
2f720 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( !zName ){.    
2f730 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e  /* If zName is N
2f740 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ULL, the upper l
2f750 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69  ayer is requesti
2f760 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  ng a temp file. 
2f770 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  */.    assert(is
2f780 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44  Delete && !syncD
2f790 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e  ir);.    rc = un
2f7a0 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41  ixGetTempname(MA
2f7b0 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a 54  X_PATHNAME+2, zT
2f7c0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
2f7d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f7e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2f7f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  c;.    }.    zNa
2f800 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a  me = zTmpname;..
2f810 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64      /* Generated
2f820 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e   temporary filen
2f830 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  ames are always 
2f840 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
2f850 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f  inated.    ** fo
2f860 72 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33  r use by sqlite3
2f870 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
2f880 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
2f890 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e   zName[strlen(zN
2f8a0 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20  ame)+1]==0 );.  
2f8b0 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  }..  /* Determin
2f8c0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2f8d0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2f8e0 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53  er passed to POS
2f8f0 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  IX function.  **
2f900 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d   open(). These m
2f910 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65  ust be calculate
2f920 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29  d even if open()
2f930 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20   is not called, 
2f940 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79  as.  ** they may
2f950 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61   be stored as pa
2f960 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  rt of the file h
2f970 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62  andle and used b
2f980 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e  y the .  ** 'con
2f990 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67  ch file' locking
2f9a0 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72   functions later
2f9b0 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69   on.  */.  if( i
2f9c0 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65  sReadonly )  ope
2f9d0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
2f9e0 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  LY;.  if( isRead
2f9f0 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67  Write ) openFlag
2fa00 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69  s |= O_RDWR;.  i
2fa10 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20  f( isCreate )   
2fa20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2fa30 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45  CREAT;.  if( isE
2fa40 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46  xclusive ) openF
2fa50 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c  lags |= (O_EXCL|
2fa60 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f  O_NOFOLLOW);.  o
2fa70 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c  penFlags |= (O_L
2fa80 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
2fa90 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20  Y);..  if( fd<0 
2faa0 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70  ){.    mode_t op
2fab0 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  enMode;         
2fac0 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69       /* Permissi
2fad0 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69  ons to create fi
2fae0 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75  le with */.    u
2faf0 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20  id_t uid;       
2fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb10 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66  Userid for the f
2fb20 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74  ile */.    gid_t
2fb30 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   gid;           
2fb40 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75           /* Grou
2fb50 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65  pid for the file
2fb60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e   */.    rc = fin
2fb70 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
2fb80 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f  zName, flags, &o
2fb90 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26  penMode, &uid, &
2fba0 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gid);.    if( rc
2fbb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fbc0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
2fbd0 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20  >pUnused );.    
2fbe0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
2fbf0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2fc00 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2fc10 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2fc20 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74  NAL );.      ret
2fc30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2fc40 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
2fc50 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
2fc60 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
2fc70 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
2fc80 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25  ENX   %-3d %s 0%
2fc90 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c  o\n", fd, zName,
2fca0 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20   openFlags));.  
2fcb0 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
2fcc0 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69  rno!=EISDIR && i
2fcd0 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69  sReadWrite && !i
2fce0 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
2fcf0 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f      /* Failed to
2fd00 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66   open the file f
2fd10 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2fd20 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f  cess. Try read-o
2fd30 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c  nly. */.      fl
2fd40 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ags &= ~(SQLITE_
2fd50 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
2fd60 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2fd70 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c  E);.      openFl
2fd80 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c  ags &= ~(O_RDWR|
2fd90 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20  O_CREAT);.      
2fda0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
2fdb0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2fdc0 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c       openFlags |
2fdd0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
2fde0 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31    isReadonly = 1
2fdf0 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62  ;.      fd = rob
2fe00 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
2fe10 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
2fe20 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ode);.    }.    
2fe30 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2fe40 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
2fe50 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
2fe60 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
2fe70 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
2fe80 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
2fe90 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
2fea0 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73  * If this proces
2feb0 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
2fec0 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61  root and if crea
2fed0 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62  ting a new rollb
2fee0 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  ack.    ** journ
2fef0 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20  al or WAL file, 
2ff00 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69  set the ownershi
2ff10 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p of the journal
2ff20 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20   or WAL to be.  
2ff30 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73    ** the same as
2ff40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
2ff50 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
2ff60 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28     if( flags & (
2ff70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
2ff80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2ff90 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
2ffa0 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28     robustFchown(
2ffb0 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20  fd, uid, gid);. 
2ffc0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
2ffd0 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66  t( fd>=0 );.  if
2ffe0 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
2fff0 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
30000 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
30010 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a  ( p->pUnused ){.
30020 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e      p->pUnused->
30030 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e  fd = fd;.    p->
30040 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
30050 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
30060 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
30070 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
30080 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b    zPath = zName;
30090 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
300a0 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54  QLITE_UNLINK_AFT
300b0 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50  ER_CLOSE).    zP
300c0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ath = sqlite3_mp
300d0 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d  rintf("%s", zNam
300e0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  e);.    if( zPat
300f0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f  h==0 ){.      ro
30100 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
30110 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
30120 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30130 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65  _NOMEM;.    }.#e
30140 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  lse.    osUnlink
30150 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
30160 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45    }.#if SQLITE_E
30170 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
30180 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  YLE.  else{.    
30190 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  p->openFlags = o
301a0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65  penFlags;.  }.#e
301b0 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d  ndif..  noLock =
301c0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
301d0 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20  PEN_MAIN_DB;..  
301e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
301f0 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
30200 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
30210 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74  _STYLE.  if( fst
30220 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f  atfs(fd, &fsInfo
30230 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73  ) == -1 ){.    s
30240 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c  toreLastErrno(p,
30250 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62   errno);.    rob
30260 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
30270 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
30280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
30290 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a  ERR_ACCESS;.  }.
302a0 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63    if (0 == strnc
302b0 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e  mp("msdos", fsIn
302c0 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
302d0 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   5)) {.    ((uni
302e0 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
302f0 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
30300 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
30310 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  S;.  }.  if (0 =
30320 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74  = strncmp("exfat
30330 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
30340 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
30350 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
30360 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d  ile)->fsFlags |=
30370 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
30380 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65  IS_MSDOS;.  }.#e
30390 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75  ndif..  /* Set u
303a0 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 74  p appropriate ct
303b0 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28  rlFlags */.  if(
303c0 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20 20   isDelete )     
303d0 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
303e0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
303f0 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69  _DELETE;.  if( i
30400 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20  sReadonly )     
30410 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
30420 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52  gs |= UNIXFILE_R
30430 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c  DONLY;.  if( noL
30440 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20 20 20  ock )           
30450 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
30460 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c   |= UNIXFILE_NOL
30470 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63 44  OCK;.  if( syncD
30480 69 72 20 29 20 20 20 20 20 20 20 20 20 20 20 20  ir )            
30490 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
304a0 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  = UNIXFILE_DIRSY
304b0 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  NC;.  if( flags 
304c0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
304d0 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d  I ) ctrlFlags |=
304e0 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a   UNIXFILE_URI;..
304f0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
30500 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
30510 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45  #if SQLITE_PREFE
30520 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
30530 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20    isAutoProxy = 
30540 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  1;.#endif.  if( 
30550 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28  isAutoProxy && (
30560 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20  zPath!=NULL) && 
30570 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66  (!noLock) && pVf
30580 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  s->xOpen ){.    
30590 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d  char *envforce =
305a0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
305b0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
305c0 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75  ING");.    int u
305d0 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20  seProxy = 0;..  
305e0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43    /* SQLITE_FORC
305f0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d  E_PROXY_LOCKING=
30600 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61  =1 means force a
30610 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c  lways use proxy,
30620 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a   0 means .    **
30630 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79   never use proxy
30640 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65  , NULL means use
30650 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c   proxy for non-l
30660 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e  ocal files only.
30670 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76    */.    if( env
30680 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20  force!=NULL ){. 
30690 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
306a0 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30  atoi(envforce)>0
306b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
306c0 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
306d0 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
306e0 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
306f0 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
30700 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
30710 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
30720 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20  Vfs, fd, pFile, 
30730 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73  zPath, ctrlFlags
30740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
30750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30760 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
30770 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
30780 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69  e((unixFile*)pFi
30790 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20  le, ":auto:");. 
307a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
307b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
307c0 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69        /* Use uni
307d0 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20  xClose to clean 
307e0 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  up the resources
307f0 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e   added in fillIn
30800 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20  UnixFile .      
30810 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72      ** and clear
30820 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75   all the structu
30830 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e  re's references.
30840 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
30850 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46  .          ** pF
30860 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69  ile->pMethods wi
30870 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71  ll be NULL so sq
30880 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c  lite3OsClose wil
30890 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20  l be a no-op .  
308a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
308b0 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70       unixClose(p
308c0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
308d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
308e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
308f0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
30900 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
30910 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63  }.#endif.  .  rc
30920 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
30930 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c  e(pVfs, fd, pFil
30940 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c  e, zPath, ctrlFl
30950 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69  ags);..open_fini
30960 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  shed:.  if( rc!=
30970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30980 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
30990 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20  >pUnused);.  }. 
309a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
309b0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
309c0 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
309d0 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
309e0 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
309f0 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
30a00 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
30a10 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
30a20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
30a30 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
30a40 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
30a50 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
30a60 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
30a70 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
30a80 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
30a90 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
30aa0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
30ab0 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
30ac0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
30ad0 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
30ae0 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
30af0 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
30b00 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
30b10 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
30b20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
30b30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
30b40 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
30b50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
30b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30b70 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66  RR_DELETE);.  if
30b80 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68  ( osUnlink(zPath
30b90 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69  )==(-1) ){.    i
30ba0 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  f( errno==ENOENT
30bb0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
30bc0 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63          || osAcc
30bd0 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a  ess(zPath,0)!=0.
30be0 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
30bf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30c00 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
30c10 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  NT;.    }else{. 
30c20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
30c30 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
30c40 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c  ERR_DELETE, "unl
30c50 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ink", zPath);.  
30c60 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
30c70 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  c;.  }.#ifndef S
30c80 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
30c90 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72  RSYNC.  if( (dir
30ca0 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a  Sync & 1)!=0 ){.
30cb0 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
30cc0 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
30cd0 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
30ce0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
30cf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f  LITE_OK ){.#if O
30d00 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
30d10 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
30d20 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
30d30 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
30d40 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
30d50 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
30d60 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
30d70 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c  IOERR_DIR_FSYNC,
30d80 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29   "fsync", zPath)
30d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30da0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
30db0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
30dc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
30dd0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
30de0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
30df0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
30e00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
30e10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30e20 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74 65   Test the existe
30e30 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73  nce of or access
30e40 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
30e50 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a  file zPath. The.
30e60 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65  ** test performe
30e70 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
30e80 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a   value of flags:
30e90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
30ea0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
30eb0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
30ec0 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20   file exists.** 
30ed0 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
30ee0 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74  S_READWRITE: Ret
30ef0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
30f00 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72  e is read and wr
30f10 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53  itable..**     S
30f20 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
30f30 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20  DONLY: Return 1 
30f40 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
30f50 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  eadable..**.** O
30f60 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
30f70 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
30f80 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73   unixAccess(.  s
30f90 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
30fa0 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46  sed,   /* The VF
30fb0 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
30fc0 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64  s xAccess method
30fd0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
30fe0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a   *zPath,      /*
30ff0 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c   Path of the fil
31000 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a  e to examine */.
31010 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
31020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
31030 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20  t do we want to 
31040 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20  learn about the 
31050 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20  zPath file? */. 
31060 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
31070 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
31080 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e  e result boolean
31090 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
310a0 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55  t amode = 0;.  U
310b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
310c0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
310d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
310e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
310f0 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77  _ACCESS; );.  sw
31100 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
31110 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
31120 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
31130 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b      amode = F_OK
31140 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
31150 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
31160 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
31170 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57  .      amode = W
31180 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  _OK|R_OK;.      
31190 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
311a0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
311b0 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  AD:.      amode 
311c0 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = R_OK;.      br
311d0 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
311e0 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
311f0 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
31200 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
31210 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73    *pResOut = (os
31220 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d  Access(zPath, am
31230 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20  ode)==0);.  if( 
31240 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
31250 43 45 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a  CESS_EXISTS && *
31260 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73  pResOut ){.    s
31270 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
31280 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61      if( 0==osSta
31290 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26  t(zPath, &buf) &
312a0 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  & buf.st_size==0
312b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f   ){.      *pResO
312c0 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ut = 0;.    }.  
312d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
312e0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
312f0 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
31300 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
31310 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
31320 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
31330 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
31340 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
31350 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
31360 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
31370 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
31380 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
31390 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
313a0 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
313b0 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
313c0 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
313d0 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
313e0 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
313f0 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
31400 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
31410 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
31420 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
31430 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
31440 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
31450 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
31460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31470 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
31480 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
31490 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
314a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
314b0 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
314c0 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
314d0 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
314e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
314f0 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
31500 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
31510 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20    char *zOut    
31520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31530 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
31540 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
31550 74 65 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  te;..  /* It's o
31560 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
31570 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
31580 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
31590 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
315a0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
315b0 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
315c0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
315d0 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
315e0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
315f0 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
31600 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
31610 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
31620 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
31630 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
31640 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
31650 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
31660 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
31670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
31680 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
31690 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
316a0 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
316b0 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
316c0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
316d0 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72   /* Attempt to r
316e0 65 73 6f 6c 76 65 20 74 68 65 20 70 61 74 68 20  esolve the path 
316f0 61 73 20 69 66 20 69 74 20 77 65 72 65 20 61 20  as if it were a 
31700 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2e 20 49  symbolic link. I
31710 66 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 20 73  f it is.  ** a s
31720 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2c 20 74 68  ymbolic link, th
31730 65 20 72 65 73 6f 6c 76 65 64 20 70 61 74 68 20  e resolved path 
31740 69 73 20 73 74 6f 72 65 64 20 69 6e 20 62 75 66  is stored in buf
31750 66 65 72 20 7a 4f 75 74 5b 5d 2e 20 4f 72 2c 20  fer zOut[]. Or, 
31760 69 66 0a 20 20 2a 2a 20 74 68 65 20 69 64 65 6e  if.  ** the iden
31770 74 69 66 69 65 64 20 66 69 6c 65 20 69 73 20 6e  tified file is n
31780 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69  ot a symbolic li
31790 6e 6b 20 6f 72 20 64 6f 65 73 20 6e 6f 74 20 65  nk or does not e
317a0 78 69 73 74 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  xist, then.  ** 
317b0 7a 50 61 74 68 20 69 73 20 63 6f 70 69 65 64 20  zPath is copied 
317c0 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 7a 4f  directly into zO
317d0 75 74 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ut. Either way, 
317e0 6e 42 79 74 65 20 69 73 20 6c 65 66 74 20 73 65  nByte is left se
317f0 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 69  t to.  ** the si
31800 7a 65 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  ze of the string
31810 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 7a 4f 75   copied into zOu
31820 74 5b 5d 20 69 6e 20 62 79 74 65 73 2e 20 20 2a  t[] in bytes.  *
31830 2f 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 52 65  /.  nByte = osRe
31840 61 64 6c 69 6e 6b 28 7a 50 61 74 68 2c 20 7a 4f  adlink(zPath, zO
31850 75 74 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 69  ut, nOut-1);.  i
31860 66 28 20 6e 42 79 74 65 3c 30 20 29 7b 0a 20 20  f( nByte<0 ){.  
31870 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 49 4e    if( errno!=EIN
31880 56 41 4c 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e  VAL && errno!=EN
31890 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 65  OENT ){.      re
318a0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
318b0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
318c0 4e 5f 42 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e  N_BKPT, "readlin
318d0 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  k", zPath);.    
318e0 7d 0a 20 20 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d  }.    zOut[nOut-
318f0 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 73  1] = '\0';.    s
31900 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
31910 6e 4f 75 74 2d 31 2c 20 7a 4f 75 74 2c 20 22 25  nOut-1, zOut, "%
31920 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  s", zPath);.    
31930 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 53  nByte = sqlite3S
31940 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20  trlen30(zOut);. 
31950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4f 75 74   }else{.    zOut
31960 5b 6e 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a  [nByte] = '\0';.
31970 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 62 75 66    }..  /* If buf
31980 66 65 72 20 7a 4f 75 74 5b 5d 20 6e 6f 77 20 63  fer zOut[] now c
31990 6f 6e 74 61 69 6e 73 20 61 6e 20 61 62 73 6f 6c  ontains an absol
319a0 75 74 65 20 70 61 74 68 20 74 68 65 72 65 20 69  ute path there i
319b0 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 0a 20  s nothing more. 
319c0 20 2a 2a 20 74 6f 20 64 6f 2e 20 49 66 20 69 74   ** to do. If it
319d0 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 6c 61   contains a rela
319e0 74 69 76 65 20 70 61 74 68 2c 20 64 6f 20 74 68  tive path, do th
319f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
31a00 2a 0a 20 20 2a 2a 20 20 20 2a 20 6d 6f 76 65 20  *.  **   * move 
31a10 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
31a20 68 20 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74  h string so that
31a30 20 69 74 20 69 73 20 61 74 20 74 68 65 20 65 6e   it is at the en
31a40 64 20 6f 66 20 74 68 0a 20 20 2a 2a 20 20 20 20  d of th.  **    
31a50 20 7a 4f 75 74 5b 5d 20 62 75 66 66 65 72 2e 0a   zOut[] buffer..
31a60 20 20 2a 2a 20 20 20 2a 20 43 61 6c 6c 20 67 65    **   * Call ge
31a70 74 63 77 64 28 29 20 74 6f 20 72 65 61 64 20 74  tcwd() to read t
31a80 68 65 20 70 61 74 68 20 6f 66 20 74 68 65 20 63  he path of the c
31a90 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
31aa0 69 72 65 63 74 6f 72 79 20 0a 20 20 2a 2a 20 20  irectory .  **  
31ab0 20 20 20 69 6e 74 6f 20 74 68 65 20 73 74 61 72     into the star
31ac0 74 20 6f 66 20 74 68 65 20 7a 4f 75 74 5b 5d 20  t of the zOut[] 
31ad0 62 75 66 66 65 72 2e 0a 20 20 2a 2a 20 20 20 2a  buffer..  **   *
31ae0 20 41 70 70 65 6e 64 20 61 20 27 2f 27 20 63 68   Append a '/' ch
31af0 61 72 61 63 74 65 72 20 74 6f 20 74 68 65 20 63  aracter to the c
31b00 77 64 20 73 74 72 69 6e 67 20 61 6e 64 20 6d 6f  wd string and mo
31b10 76 65 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20  ve the .  **    
31b20 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 62   relative path b
31b30 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 62  ack within the b
31b40 75 66 66 65 72 20 73 6f 20 74 68 61 74 20 69 74  uffer so that it
31b50 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 20 20   immediately .  
31b60 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 73 20 74  **     follows t
31b70 68 65 20 27 2f 27 2e 0a 20 20 2a 2a 0a 20 20 2a  he '/'..  **.  *
31b80 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 77  * This code is w
31b90 72 69 74 74 65 6e 20 73 6f 20 74 68 61 74 20 69  ritten so that i
31ba0 66 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f  f the combinatio
31bb0 6e 20 6f 66 20 74 68 65 20 43 57 44 20 61 6e 64  n of the CWD and
31bc0 20 72 65 6c 61 74 69 76 65 0a 20 20 2a 2a 20 70   relative.  ** p
31bd0 61 74 68 20 61 72 65 20 6c 61 72 67 65 72 20 74  ath are larger t
31be0 68 61 6e 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  han the allocate
31bf0 64 20 73 69 7a 65 20 6f 66 20 7a 4f 75 74 5b 5d  d size of zOut[]
31c00 20 74 68 65 20 43 57 44 20 69 73 20 73 69 6c 65   the CWD is sile
31c10 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 75 6e 63 61  ntly.  ** trunca
31c20 74 65 64 20 74 6f 20 6d 61 6b 65 20 69 74 20 66  ted to make it f
31c30 69 74 2e 20 54 68 69 73 20 69 73 20 4f 6b 2c 20  it. This is Ok, 
31c40 61 73 20 53 51 4c 69 74 65 20 72 65 66 75 73 65  as SQLite refuse
31c50 73 20 74 6f 20 6f 70 65 6e 20 61 6e 79 0a 20 20  s to open any.  
31c60 2a 2a 20 66 69 6c 65 20 66 6f 72 20 77 68 69 63  ** file for whic
31c70 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  h this function 
31c80 72 65 74 75 72 6e 73 20 61 20 66 75 6c 6c 20 70  returns a full p
31c90 61 74 68 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ath larger than 
31ca0 28 6e 4f 75 74 2d 38 29 0a 20 20 2a 2a 20 62 79  (nOut-8).  ** by
31cb0 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f  tes in size.  */
31cc0 0a 20 20 69 66 28 20 7a 4f 75 74 5b 30 5d 21 3d  .  if( zOut[0]!=
31cd0 27 2f 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  '/' ){.    int n
31ce0 43 77 64 3b 0a 20 20 20 20 69 6e 74 20 6e 52 65  Cwd;.    int nRe
31cf0 6d 20 3d 20 6e 4f 75 74 2d 6e 42 79 74 65 2d 31  m = nOut-nByte-1
31d00 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a  ;.    memmove(&z
31d10 4f 75 74 5b 6e 52 65 6d 5d 2c 20 7a 4f 75 74 2c  Out[nRem], zOut,
31d20 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 7a   nByte+1);.    z
31d30 4f 75 74 5b 6e 52 65 6d 2d 31 5d 20 3d 20 27 5c  Out[nRem-1] = '\
31d40 30 27 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  0';.    if( osGe
31d50 74 63 77 64 28 7a 4f 75 74 2c 20 6e 52 65 6d 2d  tcwd(zOut, nRem-
31d60 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  1)==0 ){.      r
31d70 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
31d80 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
31d90 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64  EN_BKPT, "getcwd
31da0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
31db0 0a 20 20 20 20 6e 43 77 64 20 3d 20 73 71 6c 69  .    nCwd = sqli
31dc0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 75 74  te3Strlen30(zOut
31dd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
31de0 43 77 64 3c 3d 6e 52 65 6d 2d 31 20 29 3b 0a 20  Cwd<=nRem-1 );. 
31df0 20 20 20 7a 4f 75 74 5b 6e 43 77 64 5d 20 3d 20     zOut[nCwd] = 
31e00 27 2f 27 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  '/';.    memmove
31e10 28 26 7a 4f 75 74 5b 6e 43 77 64 2b 31 5d 2c 20  (&zOut[nCwd+1], 
31e20 26 7a 4f 75 74 5b 6e 52 65 6d 5d 2c 20 6e 42 79  &zOut[nRem], nBy
31e30 74 65 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  te+1);.  }..  re
31e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31e50 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
31e60 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
31e70 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
31e80 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
31e90 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
31ea0 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
31eb0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
31ec0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
31ed0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
31ee0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
31ef0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63  library..*/.#inc
31f00 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73  lude <dlfcn.h>.s
31f10 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78  tatic void *unix
31f20 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
31f30 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  fs *NotUsed, con
31f40 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
31f50 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me){.  UNUSED_PA
31f60 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
31f70 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65  ;.  return dlope
31f80 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c  n(zFilename, RTL
31f90 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f  D_NOW | RTLD_GLO
31fa0 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  BAL);.}../*.** S
31fb0 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
31fc0 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69   function immedi
31fd0 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61  ately after a ca
31fe0 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28  ll to unixDlSym(
31ff0 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70  ) or.** unixDlOp
32000 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75  en() fails (retu
32010 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74  rns a null point
32020 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64  er). If a more d
32030 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a  etailed error.**
32040 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69   message is avai
32050 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69  lable, it is wri
32060 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e  tten to zBufOut.
32070 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73   If no error mes
32080 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  sage.** is avail
32090 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73  able, zBufOut is
320a0 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
320b0 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73   and SQLite uses
320c0 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72   a default.** er
320d0 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
320e0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
320f0 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
32100 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
32110 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
32120 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20  ufOut){.  const 
32130 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e  char *zErr;.  UN
32140 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32150 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45  otUsed);.  unixE
32160 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a  nterMutex();.  z
32170 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b  Err = dlerror();
32180 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
32190 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
321a0 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  ntf(nBuf, zBufOu
321b0 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a  t, "%s", zErr);.
321c0 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
321d0 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63  utex();.}.static
321e0 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79   void (*unixDlSy
321f0 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  m(sqlite3_vfs *N
32200 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c  otUsed, void *p,
32210 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d   const char*zSym
32220 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a  ))(void){.  /* .
32230 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70    ** GCC with -p
32240 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73  edantic-errors s
32250 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65  ays that C90 doe
32260 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f  s not allow a vo
32270 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63  id* to be.  ** c
32280 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  ast into a point
32290 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
322a0 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c  .  And yet the l
322b0 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72  ibrary dlsym() r
322c0 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75  outine.  ** retu
322d0 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63  rns a void* whic
322e0 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f  h is really a po
322f0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
32300 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20  ion.  So how do 
32310 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79  we.  ** use dlsy
32320 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74  m() with -pedant
32330 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a  ic-errors?.  **.
32340 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20    ** Variable x 
32350 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64  below is defined
32360 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72   to be a pointer
32370 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
32380 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d  aking.  ** param
32390 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20  eters void* and 
323a0 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20  const char* and 
323b0 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e  returning a poin
323c0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
323d0 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69  n..  ** We initi
323e0 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67  alize x by assig
323f0 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65  ning it a pointe
32400 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29  r to the dlsym()
32410 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
32420 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74  (That assignment
32430 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74   requires a cast
32440 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c  .)  Then we call
32450 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68   the function th
32460 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73  at.  ** x points
32470 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a   to.  .  **.  **
32480 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   This work-aroun
32490 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f  d is unlikely to
324a0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
324b0 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68  on any system wh
324c0 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61  ere.  ** you rea
324d0 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20  lly cannot cast 
324e0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
324f0 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20  er into void*.  
32500 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65  But then, on the
32510 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64  .  ** other hand
32520 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e  , dlsym() will n
32530 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20  ot work on such 
32540 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c  a system either,
32550 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a   so we have.  **
32560 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74   not really lost
32570 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a   anything..  */.
32580 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f    void (*(*x)(vo
32590 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
325a0 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45  )(void);.  UNUSE
325b0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
325c0 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69  sed);.  x = (voi
325d0 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e  d(*(*)(void*,con
325e0 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
325f0 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e  )dlsym;.  return
32600 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a   (*x)(p, zSym);.
32610 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
32620 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
32630 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
32640 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
32650 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32660 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64  ER(NotUsed);.  d
32670 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
32680 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
32690 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
326a0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
326b0 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
326c0 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
326d0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
326e0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
326f0 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
32700 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
32710 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
32720 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
32730 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
32740 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
32750 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
32760 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
32770 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
32780 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
32790 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
327a0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
327b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
327c0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73  (NotUsed);.  ass
327d0 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66  ert((size_t)nBuf
327e0 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74  >=(sizeof(time_t
327f0 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b  )+sizeof(int)));
32800 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  ..  /* We have t
32810 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
32820 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
32830 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
32840 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
32850 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
32860 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
32870 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
32880 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
32890 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
328a0 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
328b0 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
328c0 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
328d0 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
328e0 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
328f0 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
32900 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
32910 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
32920 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
32930 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
32940 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
32950 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
32960 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
32970 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
32980 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
32990 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
329a0 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
329b0 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
329c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
329d0 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
329e0 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
329f0 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
32a00 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
32a10 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
32a20 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
32a30 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
32a40 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
32a50 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
32a60 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
32a70 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
32a80 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72  f, 0, nBuf);.  r
32a90 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f  andomnessPid = o
32aa0 73 47 65 74 70 69 64 28 30 29 3b 20 20 0a 23 69  sGetpid(0);  .#i
32ab0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
32ac0 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69  E_TEST) && !defi
32ad0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
32ae0 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a  RANDOMNESS).  {.
32af0 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b      int fd, got;
32b00 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
32b10 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e  _open("/dev/uran
32b20 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  dom", O_RDONLY, 
32b30 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  0);.    if( fd<0
32b40 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
32b50 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
32b60 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
32b70 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
32b80 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  f(t));.      mem
32b90 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
32ba0 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73  (t)], &randomnes
32bb0 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e  sPid, sizeof(ran
32bc0 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20  domnessPid));.  
32bd0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
32be0 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e  of(t)+sizeof(ran
32bf0 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69  domnessPid)<=(si
32c00 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20  ze_t)nBuf );.   
32c10 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66     nBuf = sizeof
32c20 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e  (t) + sizeof(ran
32c30 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20  domnessPid);.   
32c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
32c50 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66  { got = osRead(f
32c60 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20  d, zBuf, nBuf); 
32c70 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
32c80 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
32c90 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
32ca0 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
32cb0 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
32cc0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
32cd0 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
32ce0 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
32cf0 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
32d00 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
32d10 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
32d20 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
32d30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
32d40 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
32d50 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
32d60 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
32d70 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
32d80 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
32d90 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
32da0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
32db0 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
32dc0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
32dd0 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
32de0 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
32df0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
32e00 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
32e10 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
32e20 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
32e30 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
32e40 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
32e50 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
32e60 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
32e70 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
32e80 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
32e90 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
32ea0 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
32eb0 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
32ec0 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
32ed0 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
32ee0 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
32ef0 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
32f00 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
32f10 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
32f20 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
32f30 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
32f40 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
32f50 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
32f60 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
32f70 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
32f80 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
32f90 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32fa0 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
32fb0 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
32fc0 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
32fd0 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
32fe0 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
32ff0 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
33000 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
33010 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
33020 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
33030 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
33040 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
33050 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
33060 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
33070 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
33080 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
33090 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
330a0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
330b0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
330c0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
330d0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
330e0 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
330f0 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
33100 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
33110 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
33120 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
33130 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
33140 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
33150 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
33160 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
33170 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
33180 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
33190 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
331a0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
331b0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
331c0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
331d0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
331e0 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
331f0 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
33200 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
33210 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
33220 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
33230 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
33240 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
33250 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
33260 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
33270 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
33280 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
33290 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
332a0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
332b0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
332c0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
332d0 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
332e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
332f0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
33300 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
33310 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
33320 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
33330 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
33340 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33350 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
33360 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69  *piNow){.  stati
33370 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
33380 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
33390 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
333a0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
333b0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
333c0 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66  LITE_OK;.#if def
333d0 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
333e0 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
333f0 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
33400 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
33410 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
33420 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
33430 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
33440 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
33450 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
33460 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
33470 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
33480 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
33490 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
334a0 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
334b0 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
334c0 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
334d0 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
334e0 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69  Now;.  if( getti
334f0 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
33500 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e  )==0 ){.    *piN
33510 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
33520 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
33530 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
33540 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
33550 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  1000;.  }else{. 
33560 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
33570 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RROR;.  }.#endif
33580 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
33590 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
335a0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
335b0 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
335c0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
335d0 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
335e0 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
335f0 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
33600 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33610 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
33620 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
33630 66 20 30 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  f 0 /* Not used 
33640 2a 2f 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  */./*.** Find th
33650 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
33660 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
33670 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
33680 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
33690 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
336a0 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
336b0 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
336c0 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
336d0 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
336e0 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
336f0 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
33700 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
33710 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
33720 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
33730 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62  s *NotUsed, doub
33740 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71  le *prNow){.  sq
33750 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20  lite3_int64 i = 
33760 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55  0;.  int rc;.  U
33770 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
33780 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d  NotUsed);.  rc =
33790 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
337a0 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20  Int64(0, &i);.  
337b0 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
337c0 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20  000.0;.  return 
337d0 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
337e0 66 69 6e 65 20 75 6e 69 78 43 75 72 72 65 6e 74  fine unixCurrent
337f0 54 69 6d 65 20 30 0a 23 65 6e 64 69 66 0a 0a 23  Time 0.#endif..#
33800 69 66 20 30 20 20 2f 2a 20 4e 6f 74 20 75 73 65  if 0  /* Not use
33810 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64  d */./*.** We ad
33820 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73 74  ded the xGetLast
33830 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77  Error() method w
33840 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f  ith the intentio
33850 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a  n of providing.*
33860 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76  * better low-lev
33870 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  el error message
33880 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67  s when operating
33890 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73  -system problems
338a0 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69   come up.** duri
338b0 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74  ng SQLite operat
338c0 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72  ion.  But so far
338d0 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68  , none of that h
338e0 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e  as been implemen
338f0 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ted.** in the co
33900 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75  re.  So this rou
33910 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
33920 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  lled.  For now, 
33930 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20  it is merely.** 
33940 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a  a place-holder..
33950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
33960 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  ixGetLastError(s
33970 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
33980 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
33990 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64  2, char *NotUsed
339a0 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  3){.  UNUSED_PAR
339b0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
339c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
339d0 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20  TER(NotUsed2);. 
339e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
339f0 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72  R(NotUsed3);.  r
33a00 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6c 73 65  eturn 0;.}.#else
33a10 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 47 65  .# define unixGe
33a20 74 4c 61 73 74 45 72 72 6f 72 20 30 0a 23 65 6e  tLastError 0.#en
33a30 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  dif.../*.*******
33a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a50 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33  * End of sqlite3
33a60 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
33a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a80 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
33a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33ad0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
33ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
33b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33b40 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79  **** Begin Proxy
33b50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
33b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
33b80 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
33b90 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67   a "uber-locking
33ba0 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73  -method" in this
33bb0 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73   sense:  It uses
33bc0 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f   the.** other lo
33bd0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
33be0 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20   secondary lock 
33bf0 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f  files.  Proxy lo
33c00 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65  cking is a.** me
33c10 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f  ta-layer over to
33c20 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69  p of the primiti
33c30 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ve locking imple
33c40 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46  mented above.  F
33c50 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f  or.** this reaso
33c60 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
33c70 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
33c80 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
33c90 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20   is deferred.** 
33ca0 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68  until late in th
33cb0 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66  e file (here) af
33cc0 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f  ter all of the o
33cd0 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73  ther I/O methods
33ce0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65   have.** been de
33cf0 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20  fined - so that 
33d00 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
33d10 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72  cking methods ar
33d20 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61  e available.** a
33d30 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65  s services to he
33d40 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c  lp with the impl
33d50 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72  ementation of pr
33d60 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  oxy locking..**.
33d70 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
33d80 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73  efault locking s
33d90 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65  chemes in SQLite
33da0 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20   use byte-range 
33db0 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  locks on the.** 
33dc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
33dd0 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65   coordinate safe
33de0 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63  , concurrent acc
33df0 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  ess by multiple 
33e00 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77  readers.** and w
33e10 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73  riters [http://s
33e20 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e  qlite.org/lockin
33e30 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20  gv3.html].  The 
33e40 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  five file lockin
33e50 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c  g.** states (UNL
33e60 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20  OCKED, PENDING, 
33e70 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
33e80 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65  , EXCLUSIVE) are
33e90 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
33ea0 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20  as POSIX read & 
33eb0 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72  write locks over
33ec0 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f   fixed set of lo
33ed0 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63  cations (via fsc
33ee0 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61  tl),.** on AFP a
33ef0 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c  nd SMB only excl
33f00 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65  usive byte-range
33f10 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c   locks are avail
33f20 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a  able via fsctl.*
33f30 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27  * with _IOWR('z'
33f40 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
33f50 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74  eRangeLockPB2) t
33f60 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65  o track the same
33f70 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f   5 states..** To
33f80 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44   simulate a F_RD
33f90 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65  LCK on the share
33fa0 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20  d range, on AFP 
33fb0 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  a randomly selec
33fc0 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69  ted.** address i
33fd0 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
33fe0 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
33ff0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
34000 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61  he entire.** sha
34010 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
34020 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53  en for an EXCLUS
34030 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a  IVE lock):.**.**
34040 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
34050 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  TE        0x4000
34060 30 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45 53  0000.**      RES
34070 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20  ERVED_BYTE      
34080 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20   0x40000001.**  
34090 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45      SHARED_RANGE
340a0 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
340b0 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30  02 -> 0x40000200
340c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
340d0 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f  s well on the lo
340e0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  cal file system,
340f0 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61   but shows a nea
34100 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77  rly 100x.** slow
34110 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72  down in read per
34120 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20  formance on AFP 
34130 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20  because the AFP 
34140 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a  client disables.
34150 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68  ** the read cach
34160 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67  e when byte-rang
34170 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73  e locks are pres
34180 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74  ent.  Enabling t
34190 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65  he read.** cache
341a0 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65   exposes a cache
341b0 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c   coherency probl
341c0 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65  em that is prese
341d0 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a  nt on all OS X.*
341e0 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77  * supported netw
341f0 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73  ork file systems
34200 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62  .  NFS and AFP b
34210 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a  oth observe the.
34220 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e  ** close-to-open
34230 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65   semantics for e
34240 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f  nsuring cache co
34250 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70  herency.** [http
34260 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72  ://nfs.sourcefor
34270 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c  ge.net/#faq_a8],
34280 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
34290 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61  effectively.** a
342a0 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69  ddress the requi
342b0 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63  rements for conc
342c0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
342d0 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
342e0 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e  le.** readers an
342f0 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74  d writers.** [ht
34300 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e  tp://www.nabble.
34310 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46  com/SQLite-on-NF
34320 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63  S-cache-coherenc
34330 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d  y-td15655701.htm
34340 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64  l]..**.** To add
34350 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d  ress the perform
34360 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63  ance and cache c
34370 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c  oherency issues,
34380 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   proxy file lock
34390 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
343a0 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20  he way database 
343b0 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f  access is contro
343c0 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67  lled by limiting
343d0 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20   access to a.** 
343e0 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61  single host at a
343f0 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67   time and moving
34400 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20   file locks off 
34410 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
34420 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f  file.** and onto
34430 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e   a proxy file on
34440 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
34450 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a  system.  .**.**.
34460 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c  ** Using proxy l
34470 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ocks.** --------
34480 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
34490 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71  C APIs.**.**  sq
344a0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
344b0 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
344c0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f  QLITE_FCNTL_SET_
344d0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
344e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
344f0 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70          <proxy_p
34500 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29  ath> | ":auto:")
34510 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.**  sqlite3_fi
34520 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
34530 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bname, SQLITE_FC
34540 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_GET_LOCKPROX
34550 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
34560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34570 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a  &<proxy_path>);.
34580 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61  **.**.** SQL pra
34590 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47  gmas.**.**  PRAG
345a0 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
345b0 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70  ck_proxy_file=<p
345c0 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75  roxy_path> | :au
345d0 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  to:.**  PRAGMA [
345e0 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
345f0 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20  roxy_file.**.** 
34600 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74  Specifying ":aut
34610 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69  o:" means that i
34620 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e  f there is a con
34630 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d  ch file with a m
34640 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20  atching.** host 
34650 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72  ID in it, the pr
34660 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20  oxy path in the 
34670 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20  conch file will 
34680 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69  be used, otherwi
34690 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61  se.** a proxy pa
346a0 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  th based on the 
346b0 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a  user's temp dir.
346c0 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28  ** (via confstr(
346d0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
346e0 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77  TEMP_DIR,...)) w
346f0 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20  ill be used and 
34700 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72  the.** actual pr
34710 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  oxy file name is
34720 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
34730 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74  the name and pat
34740 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  h of the.** data
34750 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20  base file.  For 
34760 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
34770 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73       For databas
34780 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d  e path "/Users/m
34790 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20  e/foo.db" .**   
347a0 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74      The lock pat
347b0 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64  h will be "<tmpd
347c0 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73  ir>/sqliteplocks
347d0 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64  /_Users_me_foo.d
347e0 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20  b:auto:").**.** 
347f0 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78  Once a lock prox
34800 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  y is configured 
34810 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
34820 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61  onnection, it ca
34830 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f  n not.** be remo
34840 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20  ved, however it 
34850 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20  may be switched 
34860 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
34870 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a  roxy path via.**
34880 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20   the above APIs 
34890 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f  (assuming the co
348a0 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nch file is not 
348b0 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e  being held by an
348c0 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74  other.** connect
348d0 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e  ion or process).
348e0 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70   .**.**.** How p
348f0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  roxy locking wor
34900 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
34910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
34920 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c  .** Proxy file l
34930 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72  ocking relies pr
34940 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e  imarily on two n
34950 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69  ew supporting fi
34960 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  les: .**.**   * 
34970 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c   conch file to l
34980 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74  imit access to t
34990 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
349a0 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73   to a single hos
349b0 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74  t.**      at a t
349c0 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70  ime.**.**   *  p
349d0 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74  roxy file to act
349e0 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20   as a proxy for 
349f0 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  the advisory loc
34a00 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20  ks normally.**  
34a10 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65      taken on the
34a20 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20   database.**.** 
34a30 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d  The conch file -
34a40 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20   to use a proxy 
34a50 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73  file, sqlite mus
34a60 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68  t first "hold th
34a70 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74  e conch".** by t
34a80 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d  aking an sqlite-
34a90 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63  style shared loc
34aa0 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  k on the conch f
34ab0 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65  ile, reading the
34ac0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64  .** contents and
34ad0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68   comparing the h
34ae0 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73  ost's unique hos
34af0 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29  t ID (see below)
34b00 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f   and lock.** pro
34b10 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20  xy path against 
34b20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
34b30 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20  d in the conch. 
34b40 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
34b50 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  is.** stored in 
34b60 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
34b70 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ry as the databa
34b80 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
34b90 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20  file name.** is 
34ba0 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20  patterned after 
34bb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34bc0 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74  e name as ".<dat
34bd0 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68  abasename>-conch
34be0 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  "..** If the con
34bf0 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  ch file does not
34c00 20 65 78 69 73 74 2c 20 6f 72 20 69 74 73 20 63   exist, or its c
34c10 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d  ontents do not m
34c20 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74  atch the.** host
34c30 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79   ID and/or proxy
34c40 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20   path, then the 
34c50 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65  lock is escalate
34c60 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  d to an exclusiv
34c70 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68  e.** lock and th
34c80 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
34c90 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64  tents is updated
34ca0 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49   with the host I
34cb0 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70  D and proxy.** p
34cc0 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ath and the lock
34cd0 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74   is downgraded t
34ce0 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
34cf0 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63  again.  If the c
34d00 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20  onch.** is held 
34d10 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  by another proce
34d20 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65  ss (with a share
34d30 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63  d lock), the exc
34d40 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77  lusive lock.** w
34d50 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c  ill fail and SQL
34d60 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
34d70 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
34d80 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73  proxy file - a s
34d90 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20  ingle-byte file 
34da0 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76  used for all adv
34db0 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73  isory file locks
34dc0 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b  .** normally tak
34dd0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
34de0 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20  se file.   This 
34df0 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20  allows for safe 
34e00 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  sharing.** of th
34e10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
34e20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61  for multiple rea
34e30 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
34e40 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
34e50 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20  host (the conch 
34e60 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
34e70 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61  y all use the sa
34e80 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  me local lock fi
34e90 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65  le)..**.** Reque
34ea0 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70  sting the lock p
34eb0 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d  roxy does not im
34ec0 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74  mediately take t
34ed0 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a  he conch, it is.
34ee0 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68  ** only taken wh
34ef0 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71  en the first req
34f00 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74  uest to lock dat
34f10 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61  abase file is ma
34f20 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61  de.  .** This ma
34f30 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74  tches the semant
34f40 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69  ics of the tradi
34f50 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62  tional locking b
34f60 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a  ehavior, where.*
34f70 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e  * opening a conn
34f80 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61  ection to a data
34f90 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e  base file does n
34fa0 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f  ot take a lock o
34fb0 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61  n it..** The sha
34fc0 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20  red lock and an 
34fd0 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  open file descri
34fe0 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69  ptor are maintai
34ff0 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68  ned until .** th
35000 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
35010 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
35020 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  closed. .**.** T
35030 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e  he proxy file an
35040 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  d the lock file 
35050 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65  are never delete
35060 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e  d so they only n
35070 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65  eed.** to be cre
35080 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74  ated the first t
35090 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65  ime they are use
350a0 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  d..**.** Configu
350b0 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a  ration options.*
350c0 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
350d0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53  -------.**.**  S
350e0 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
350f0 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a  XY_LOCKING.**.**
35100 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20         Database 
35110 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f  files accessed o
35120 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  n non-local file
35130 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20   systems are.** 
35140 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61        automatica
35150 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66  lly configured f
35160 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
35170 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65  , lock files are
35180 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20  .**       named 
35190 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73  automatically us
351a0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67  ing the same log
351b0 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50  ic as.**       P
351c0 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79  RAGMA lock_proxy
351d0 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a  _file=":auto:".*
351e0 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45  *    .**  SQLITE
351f0 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a  _PROXY_DEBUG.**.
35200 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73  **       Enables
35210 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20   the logging of 
35220 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64  error messages d
35230 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69  uring host id fi
35240 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72  le.**       retr
35250 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69  ieval and creati
35260 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52  on.**.**  LOCKPR
35270 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20  OXYDIR.**.**    
35280 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65     Overrides the
35290 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f   default directo
352a0 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ry used for lock
352b0 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61   proxy files tha
352c0 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e  t.**       are n
352d0 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
352e0 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74  ly via the ":aut
352f0 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a  o:" setting.**.*
35300 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  *  SQLITE_DEFAUL
35310 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
35320 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20  SSIONS.**.**    
35330 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74     Permissions t
35340 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74  o use when creat
35350 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
35360 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a  for storing the.
35370 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72  **       lock pr
35380 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20  oxy files, only 
35390 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52  used when LOCKPR
353a0 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65  OXYDIR is not se
353b0 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20  t..**    .**    
353c0 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64  .** As mentioned
353d0 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d   above, when com
353e0 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
353f0 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
35400 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69  OCKING,.** setti
35410 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  ng the environme
35420 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49  nt variable SQLI
35430 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
35440 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c  OCKING to 1 will
35450 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20  .** force proxy 
35460 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73  locking to be us
35470 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  ed for every dat
35480 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65  abase file opene
35490 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c  d, and 0.** will
354a0 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63   force automatic
354b0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
354c0 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f  o be disabled fo
354d0 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
354e0 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69  * files (explici
354f0 74 6c 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20  tly calling the 
35500 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54  SQLITE_FCNTL_SET
35510 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70  _LOCKPROXYFILE p
35520 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69  ragma or.** sqli
35530 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  te_file_control 
35540 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63  API is not affec
35550 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f  ted by SQLITE_FO
35560 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
35570 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72  G)..*/../*.** Pr
35580 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  oxy locking is o
35590 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
355a0 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20   MacOSX .*/.#if 
355b0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
355c0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
355d0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
355e0 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  E../*.** The pro
355f0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
35600 20 68 61 73 20 74 68 65 20 70 61 74 68 20 61 6e   has the path an
35610 64 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  d file structure
35620 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65  s for the remote
35630 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70   .** and local p
35640 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74  roxy files in it
35650 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
35660 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  ct proxyLockingC
35670 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b  ontext proxyLock
35680 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
35690 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  ct proxyLockingC
356a0 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46  ontext {.  unixF
356b0 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20  ile *conchFile; 
356c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
356d0 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
356e0 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50  char *conchFileP
356f0 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ath;         /* 
35700 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  Name of the conc
35710 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  h file */.  unix
35720 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b  File *lockProxy;
35730 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
35740 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
35750 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b   */.  char *lock
35760 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20  ProxyPath;      
35770 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
35780 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
35790 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50  e */.  char *dbP
357a0 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
357b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
357c0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a  he open file */.
357d0 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b    int conchHeld;
357e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
357f0 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63 68  * 1 if the conch
35800 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66 20   is held, -1 if 
35810 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 69 6e  lockless */.  in
35820 74 20 6e 46 61 69 6c 73 3b 20 20 20 20 20 20 20  t nFails;       
35830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
35840 6d 62 65 72 20 6f 66 20 63 6f 6e 63 68 20 74 61  mber of conch ta
35850 6b 69 6e 67 20 66 61 69 6c 75 72 65 73 20 2a 2f  king failures */
35860 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b  .  void *oldLock
35870 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20  ingContext;     
35880 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b  /* Original lock
35890 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65  ingcontext to re
358a0 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a  store on close *
358b0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  /.  sqlite3_io_m
358c0 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f  ethods const *pO
358d0 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a  ldMethod;     /*
358e0 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65   Original I/O me
358f0 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20  thods for close 
35900 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
35910 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
35920 65 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64  e path for the d
35930 61 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74  atabase at dbPat
35940 68 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  h is written int
35950 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69  o lPath, .** whi
35960 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ch must point to
35970 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65   valid, writable
35980 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e   memory large en
35990 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65  ough for a maxLe
359a0 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65  n length.** file
359b0 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69   path. .*/.stati
359c0 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f  c int proxyGetLo
359d0 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
359e0 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
359f0 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d  *lPath, size_t m
35a00 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65  axLen){.  int le
35a10 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a  n;.  int dbLen;.
35a20 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66    int i;..#ifdef
35a30 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20   LOCKPROXYDIR.  
35a40 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
35a50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49  ath, LOCKPROXYDI
35a60 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73  R, maxLen);.#els
35a70 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41  e.# ifdef _CS_DA
35a80 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
35a90 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21  IR.  {.    if( !
35aa0 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
35ab0 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
35ac0 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29  , lPath, maxLen)
35ad0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
35ae0 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E(("GETLOCKPATH 
35af0 20 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f   failed %s errno
35b00 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%d pid=%d\n",. 
35b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50                lP
35b20 61 74 68 2c 20 65 72 72 6e 6f 2c 20 6f 73 47 65  ath, errno, osGe
35b30 74 70 69 64 28 30 29 29 29 3b 0a 20 20 20 20 20  tpid(0)));.     
35b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
35b50 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  OERR_LOCK;.    }
35b60 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
35b70 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74  at(lPath, "sqlit
35b80 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e  eplocks", maxLen
35b90 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73  );    .  }.# els
35ba0 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  e.  len = strlcp
35bb0 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22  y(lPath, "/tmp/"
35bc0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64  , maxLen);.# end
35bd0 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  if.#endif..  if(
35be0 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27   lPath[len-1]!='
35bf0 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  /' ){.    len = 
35c00 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
35c10 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d  /", maxLen);.  }
35c20 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f  .  .  /* transfo
35c30 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74  rm the db path t
35c40 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65  o a unique cache
35c50 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e   name */.  dbLen
35c60 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
35c70 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69  bPath);.  for( i
35c80 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28  =0; i<dbLen && (
35c90 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61  i+len+7)<(int)ma
35ca0 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xLen; i++){.    
35cb0 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b  char c = dbPath[
35cc0 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b  i];.    lPath[i+
35cd0 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f  len] = (c=='/')?
35ce0 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61  '_':c;.  }.  lPa
35cf0 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a  th[i+len]='\0';.
35d00 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c    strlcat(lPath,
35d10 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65   ":auto:", maxLe
35d20 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  n);.  OSTRACE(("
35d30 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  GETLOCKPATH  pro
35d40 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
35d50 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68  pid=%d\n", lPath
35d60 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
35d70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35d80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20  _OK;.}../* . ** 
35d90 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b  Creates the lock
35da0 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69   file and any mi
35db0 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  ssing directorie
35dc0 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a  s in lockPath. *
35dd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
35de0 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
35df0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63  (const char *loc
35e00 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c  kPath){.  int i,
35e10 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66   len;.  char buf
35e20 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
35e30 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20  int start = 0;. 
35e40 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50   .  assert(lockP
35e50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a  ath!=NULL);.  /*
35e60 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61   try to create a
35e70 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  ll the intermedi
35e80 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20  ate directories 
35e90 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29  */.  len = (int)
35ea0 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29  strlen(lockPath)
35eb0 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63  ;.  buf[0] = loc
35ec0 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28  kPath[0];.  for(
35ed0 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b   i=1; i<len; i++
35ee0 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
35ef0 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26  Path[i] == '/' &
35f00 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30  & (i - start > 0
35f10 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e  ) ){.      /* on
35f20 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66  ly mkdir if leaf
35f30 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22   dir != "." or "
35f40 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20  /" or ".." */.  
35f50 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e      if( i-start>
35f60 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31  2 || (i-start==1
35f70 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
35f80 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
35f90 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20  rt] != '/') .   
35fa0 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72        || (i-star
35fb0 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72  t==2 && buf[star
35fc0 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66  t] != '.' && buf
35fd0 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27  [start+1] != '.'
35fe0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66  ) ){.        buf
35ff0 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20  [i]='\0';.      
36000 20 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75    if( osMkdir(bu
36010 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  f, SQLITE_DEFAUL
36020 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
36030 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20  SSIONS) ){.     
36040 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72       int err=err
36050 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  no;.          if
36060 28 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20  ( err!=EEXIST ) 
36070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53  {.            OS
36080 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f  TRACE(("CREATELO
36090 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63  CKPATH  FAILED c
360a0 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20  reating %s, ".  
360b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
360c0 20 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c     "'%s' proxy l
360d0 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
360e0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
360f0 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c              buf,
36100 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20   strerror(err), 
36110 6c 6f 63 6b 50 61 74 68 2c 20 6f 73 47 65 74 70  lockPath, osGetp
36120 69 64 28 30 29 29 29 3b 0a 20 20 20 20 20 20 20  id(0)));.       
36130 20 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b       return err;
36140 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
36160 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a       start=i+1;.
36170 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d      }.    buf[i]
36180 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a   = lockPath[i];.
36190 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
361a0 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
361b0 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
361c0 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 6c 6f 63  %s pid=%d\n",loc
361d0 6b 50 61 74 68 2c 6f 73 47 65 74 70 69 64 28 30  kPath,osGetpid(0
361e0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  )));.  return 0;
361f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
36200 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20   a new VFS file 
36210 64 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72  descriptor (stor
36220 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ed in memory obt
36230 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
36240 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e  lite3_malloc) an
36250 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  d open the file 
36260 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20  named "path" in 
36270 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
36280 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  tor..**.** The c
36290 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
362a0 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f  ible not only fo
362b0 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69  r closing the fi
362c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
362d0 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72   but also for fr
362e0 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79  eeing the memory
362f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
36300 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
36310 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ptor..*/.static 
36320 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55  int proxyCreateU
36330 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e  nixFile(.    con
36340 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
36350 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f        /* path fo
36360 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69  r the new unixFi
36370 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69  le */.    unixFi
36380 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20  le **ppFile,    
36390 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63     /* unixFile c
363a0 72 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72  reated and retur
363b0 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20  ned by ref */.  
363c0 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65    int islockfile
363d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66             /* if
363e0 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e   non zero missin
363f0 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63  g dirs will be c
36400 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20  reated */.) {.  
36410 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75  int fd = -1;.  u
36420 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20  nixFile *pNew;. 
36430 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36440 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46  _OK;.  int openF
36450 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
36460 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69 74  O_CREAT;.  sqlit
36470 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b  e3_vfs dummyVfs;
36480 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20  .  int terrno = 
36490 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  0;.  UnixUnusedF
364a0 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c  d *pUnused = NUL
364b0 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73  L;..  /* 1. firs
364c0 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72  t try to open/cr
364d0 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  eate the file.  
364e0 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66 61  ** 2. if that fa
364f0 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69 73  ils, and this is
36500 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f   a lock file (no
36510 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63 72  t-conch), try cr
36520 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
36530 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 69  parent directori
36540 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79 20  es and then try 
36550 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69  again..  ** 3. i
36560 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74 72  f that fails, tr
36570 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  y to open the fi
36580 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a  le read-only.  *
36590 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65 74 75  * otherwise retu
365a0 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63 6b  rn BUSY (if lock
365b0 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50   file) or CANTOP
365c0 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  EN for the conch
365d0 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e   file.  */.  pUn
365e0 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
365f0 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65 6e  bleFd(path, open
36600 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 55  Flags);.  if( pU
36610 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64 20  nused ){.    fd 
36620 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20  = pUnused->fd;. 
36630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75   }else{.    pUnu
36640 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
36650 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70  lloc64(sizeof(*p
36660 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66  Unused));.    if
36670 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
36680 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
36690 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
366a0 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
366b0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
366c0 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
366d0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74  Flags, 0);.    t
366e0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
366f0 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
36700 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20  rrno==ENOENT && 
36710 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
36720 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65      if( proxyCre
36730 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68  ateLockPath(path
36740 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  ) == SQLITE_OK )
36750 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72  {.        fd = r
36760 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
36770 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a   openFlags, 0);.
36780 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36790 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
367a0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20      openFlags = 
367b0 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64  O_RDONLY;.    fd
367c0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
367d0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
367e0 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  0);.    terrno =
367f0 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66   errno;.  }.  if
36800 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66  ( fd<0 ){.    if
36810 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  ( islockfile ){.
36820 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
36830 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
36840 20 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72      switch (terr
36850 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65  no) {.      case
36860 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20   EACCES:.       
36870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
36880 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ERM;.      case 
36890 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65  EIO: .        re
368a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
368b0 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20  R_LOCK; /* even 
368c0 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65  though it is the
368d0 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20   conch */.      
368e0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
368f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
36900 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
36910 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65    }.  }.  .  pNe
36920 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
36930 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
36940 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b  (sizeof(*pNew));
36950 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c  .  if( pNew==NUL
36960 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  L ){.    rc = SQ
36970 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
36980 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f  goto end_create_
36990 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d  proxy;.  }.  mem
369a0 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
369b0 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
369c0 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67    pNew->openFlag
369d0 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
369e0 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66   memset(&dummyVf
369f0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  s, 0, sizeof(dum
36a00 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79  myVfs));.  dummy
36a10 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28  Vfs.pAppData = (
36a20 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
36a30 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79  oFinder;.  dummy
36a40 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d  Vfs.zName = "dum
36a50 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e  my";.  pUnused->
36a60 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73  fd = fd;.  pUnus
36a70 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e  ed->flags = open
36a80 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70  Flags;.  pNew->p
36a90 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
36aa0 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  ;.  .  rc = fill
36ab0 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d  InUnixFile(&dumm
36ac0 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c 69 74  yVfs, fd, (sqlit
36ad0 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70  e3_file*)pNew, p
36ae0 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ath, 0);.  if( r
36af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36b00 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e      *ppFile = pN
36b10 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ew;.    return S
36b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e  QLITE_OK;.  }.en
36b30 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20  d_create_proxy: 
36b40 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f     .  robust_clo
36b50 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c  se(pNew, fd, __L
36b60 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65  INE__);.  sqlite
36b70 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
36b80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e  sqlite3_free(pUn
36b90 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  used);.  return 
36ba0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
36bb0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d  LITE_TEST./* sim
36bc0 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
36bd0 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
36be0 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
36bf0 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74  ile paths */.int
36c00 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
36c10 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  num = 0;.#endif.
36c20 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
36c30 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20  OSTIDLEN    16  
36c40 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f  /* conch file ho
36c50 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a  st id length */.
36c60 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47 45 54  .#ifdef HAVE_GET
36c70 48 4f 53 54 55 55 49 44 0a 2f 2a 20 4e 6f 74 20  HOSTUUID./* Not 
36c80 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69  always defined i
36c90 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73  n the headers as
36ca0 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
36cb0 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65  */.extern int ge
36cc0 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74  thostuuid(uuid_t
36cd0 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63   id, const struc
36ce0 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74  t timespec *wait
36cf0 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 67 65  );.#endif../* ge
36d00 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 76 69  t the host ID vi
36d10 61 20 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c  a gethostuuid(),
36d20 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f   pHostID must po
36d30 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53  int to PROXY_HOS
36d40 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73  TIDLEN .** bytes
36d50 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d   of writable mem
36d60 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
36d70 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49  nt proxyGetHostI
36d80 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  D(unsigned char 
36d90 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70  *pHostID, int *p
36da0 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  Error){.  assert
36db0 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  (PROXY_HOSTIDLEN
36dc0 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f   == sizeof(uuid_
36dd0 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48  t));.  memset(pH
36de0 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f  ostID, 0, PROXY_
36df0 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 64  HOSTIDLEN);.#ifd
36e00 65 66 20 48 41 56 45 5f 47 45 54 48 4f 53 54 55  ef HAVE_GETHOSTU
36e10 55 49 44 0a 20 20 7b 0a 20 20 20 20 73 74 72 75  UID.  {.    stru
36e20 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65  ct timespec time
36e30 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a  out = {1, 0}; /*
36e40 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a   1 sec timeout *
36e50 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73  /.    if( gethos
36e60 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26  tuuid(pHostID, &
36e70 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20  timeout) ){.    
36e80 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
36e90 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72  o;.      if( pEr
36ea0 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ror ){.        *
36eb0 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
36ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
36ed0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
36ee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
36ef0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
36f00 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e  TER(pError);.#en
36f10 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
36f20 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75  E_TEST.  /* simu
36f30 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
36f40 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
36f50 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
36f60 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66  le paths */.  if
36f70 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
36f80 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20  _num != 0){.    
36f90 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68  pHostID[0] = (ch
36fa0 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b  ar)(pHostID[0] +
36fb0 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f   (char)(sqlite3_
36fc0 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46  hostid_num & 0xF
36fd0 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  F));.  }.#endif.
36fe0 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
36ff0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
37000 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
37010 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c  ains the header,
37020 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63   host id and loc
37030 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a  k file path. */.
37040 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f  #define PROXY_CO
37050 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f  NCHVERSION 2   /
37060 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c  * 1-byte header,
37070 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64   16-byte host id
37080 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e  , path */.#defin
37090 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  e PROXY_HEADERLE
370a0 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63  N    1   /* conc
370b0 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65  h file header le
370c0 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ngth */.#define 
370d0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
370e0 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52     (PROXY_HEADER
370f0 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
37100 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f  LEN).#define PRO
37110 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20  XY_MAXCONCHLEN  
37120 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
37130 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
37140 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a  +MAXPATHLEN)../*
37150 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70   .** Takes an op
37160 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63  en conch file, c
37170 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  opies the conten
37180 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68  ts to a new path
37190 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20   and then moves 
371a0 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68  .** it back.  Th
371b0 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  e newly created 
371c0 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63  file's file desc
371d0 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e  riptor is assign
371e0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ed to the.** con
371f0 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  ch file structur
37200 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68  e and finally th
37210 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68  e original conch
37220 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
37230 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20   is .** closed. 
37240 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   Returns zero if
37250 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
37260 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
37270 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75  BreakConchLock(u
37280 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
37290 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29  uuid_t myHostID)
372a0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
372b0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
372c0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
372d0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
372e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
372f0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
37300 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
37310 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74  chFile;.  char t
37320 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
37330 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f  ;.  char buf[PRO
37340 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
37350 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d  .  char *cPath =
37360 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
37370 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72  Path;.  size_t r
37380 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69  eadLen = 0;.  si
37390 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30  ze_t pathLen = 0
373a0 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b  ;.  char errmsg[
373b0 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20  64] = "";.  int 
373c0 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  fd = -1;.  int r
373d0 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44  c = -1;.  UNUSED
373e0 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73  _PARAMETER(myHos
373f0 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  tID);..  /* crea
37400 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
37410 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
37420 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
37430 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
37440 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
37450 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
37460 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
37470 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
37480 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
37490 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
374a0 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
374b0 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
374c0 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
374d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
374e0 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
374f0 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20  g),errmsg,"path 
37500 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
37510 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20  (int)pathLen);. 
37520 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
37530 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
37540 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63  read the conch c
37550 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64  ontent */.  read
37560 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  Len = osPread(co
37570 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
37580 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
37590 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
375a0 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
375b0 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c  INDEX ){.    sql
375c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
375d0 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
375e0 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20  msg,"read error 
375f0 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72  (len %d)",(int)r
37600 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
37610 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
37620 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
37630 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
37640 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
37650 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62  le */.  fd = rob
37660 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20  ust_open(tPath, 
37670 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
37680 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69  O_EXCL), 0);.  i
37690 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73  f( fd<0 ){.    s
376a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
376b0 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
376c0 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20  errmsg, "create 
376d0 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
376e0 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
376f0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
37700 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65  }.  if( osPwrite
37710 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65  (fd, buf, readLe
37720 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f  n, 0) != (ssize_
37730 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20  t)readLen ){.   
37740 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
37750 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
37760 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65  , errmsg, "write
37770 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
37780 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
37790 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
377a0 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28   }.  if( rename(
377b0 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b  tPath, cPath) ){
377c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
377d0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
377e0 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72  msg), errmsg, "r
377f0 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64  ename failed (%d
37800 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
37810 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
37820 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ck;.  }.  rc = 0
37830 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
37840 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65  rr, "broke stale
37850 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20   lock on %s\n", 
37860 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74  cPath);.  robust
37870 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f  _close(pFile, co
37880 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  nchFile->h, __LI
37890 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69  NE__);.  conchFi
378a0 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f  le->h = fd;.  co
378b0 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
378c0 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
378d0 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61  CREAT;..end_brea
378e0 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20  klock:.  if( rc 
378f0 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  ){.    if( fd>=0
37900 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
37910 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
37920 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
37930 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ile, fd, __LINE_
37940 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  _);.    }.    fp
37950 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
37960 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
37970 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
37980 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
37990 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
379a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
379b0 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
379c0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
379d0 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
379e0 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
379f0 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
37a00 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  id matches..*/.s
37a10 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
37a20 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
37a30 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
37a40 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c   myHostID, int l
37a50 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78  ockType){.  prox
37a60 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37a70 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
37a80 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
37a90 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
37aa0 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
37ab0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
37ac0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
37ad0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37ae0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69  E_OK;.  int nTri
37af0 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  es = 0;.  struct
37b00 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d   timespec conchM
37b10 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d  odTime;.  .  mem
37b20 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d  set(&conchModTim
37b30 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e  e, 0, sizeof(con
37b40 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64  chModTime));.  d
37b50 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e  o {.    rc = con
37b60 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
37b70 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
37b80 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
37b90 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
37ba0 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69  nTries ++;.    i
37bb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
37bc0 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  SY ){.      /* I
37bd0 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65  f the lock faile
37be0 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20  d (busy):.      
37bf0 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20   * 1st try: get 
37c00 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20  the mod time of 
37c10 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20  the conch, wait 
37c20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61  0.5s and try aga
37c30 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e  in. .       * 2n
37c40 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74  d try: fail if t
37c50 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e  he mod time chan
37c60 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69  ged or host id i
37c70 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69  s different, wai
37c80 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20  t .       *     
37c90 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64        10 sec and
37ca0 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20   try again.     
37cb0 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65    * 3rd try: bre
37cc0 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65  ak the lock unle
37cd0 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  ss the mod time 
37ce0 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20  has changed..   
37cf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72      */.      str
37d00 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
37d10 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
37d20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62  conchFile->h, &b
37d30 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  uf) ){.        s
37d40 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
37d50 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
37d60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
37d70 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
37d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
37d90 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
37da0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  1 ){.        con
37db0 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e  chModTime = buf.
37dc0 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20  st_mtimespec;.  
37dd0 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30        usleep(500
37de0 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e  000); /* wait 0.
37df0 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  5 sec and try th
37e00 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20  e lock again*/. 
37e10 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
37e20 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
37e30 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
37e40 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >1 );.      if( 
37e50 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
37e60 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74  sec != buf.st_mt
37e70 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c  imespec.tv_sec |
37e80 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63  | .         conc
37e90 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63  hModTime.tv_nsec
37ea0 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
37eb0 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a  spec.tv_nsec ){.
37ec0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
37ed0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
37ee0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
37ef0 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29   if( nTries==2 )
37f00 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72  {  .        char
37f10 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43   tBuf[PROXY_MAXC
37f20 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
37f30 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72    int len = osPr
37f40 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
37f50 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  , tBuf, PROXY_MA
37f60 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
37f70 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30         if( len<0
37f80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
37f90 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
37fa0 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
37fb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
37fc0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
37fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37fe0 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f    if( len>PROXY_
37ff0 50 41 54 48 49 4e 44 45 58 20 26 26 20 74 42 75  PATHINDEX && tBu
38000 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58  f[0]==(char)PROX
38010 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b  Y_CONCHVERSION){
38020 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
38030 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
38040 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ck if the host i
38050 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  d doesn't match 
38060 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
38070 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66   0!=memcmp(&tBuf
38080 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
38090 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
380a0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b  XY_HOSTIDLEN) ){
380b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
380c0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
380d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
380e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
380f0 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
38100 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  reak the lock on
38110 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61   short read or a
38120 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63   version mismatc
38130 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  h */.          r
38140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
38150 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
38160 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30       usleep(1000
38170 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31  0000); /* wait 1
38180 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  0 sec and try th
38190 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a  e lock again */.
381a0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
381b0 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
381c0 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20   .      assert( 
381d0 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20  nTries==3 );.   
381e0 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42     if( 0==proxyB
381f0 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  reakConchLock(pF
38200 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29  ile, myHostID) )
38210 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
38220 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
38230 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
38240 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
38250 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
38260 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
38270 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
38280 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
38290 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ile, SHARED_LOCK
382a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
382b0 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
382c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
382d0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
382e0 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
382f0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
38300 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  e, lockType);.  
38310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
38320 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28      }.  } while(
38330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
38340 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a   && nTries<3 );.
38350 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
38360 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20  }../* Takes the 
38370 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20  conch by taking 
38380 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  a shared lock an
38390 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  d read the conte
383a0 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a  nts conch, if .*
383b0 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f  * lockPath is no
383c0 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74  n-NULL, the host
383d0 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c   ID and lock fil
383e0 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63  e path must matc
383f0 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c  h.  A NULL .** l
38400 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68  ockPath means th
38410 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20  at the lockPath 
38420 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
38430 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69  e will be used i
38440 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49  f the .** host I
38450 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e  Ds match, or a n
38460 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  ew lock path wil
38470 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61  l be generated a
38480 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
38490 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20   and written to 
384a0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a  the conch file..
384b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
384c0 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69  oxyTakeConch(uni
384d0 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
384e0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
384f0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
38500 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
38510 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
38520 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20  ngContext; .  . 
38530 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
38540 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72  Held!=0 ){.    r
38550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
38560 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
38570 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
38580 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
38590 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20  ile;.    uuid_t 
385a0 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e  myHostID;.    in
385b0 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  t pError = 0;.  
385c0 20 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50    char readBuf[P
385d0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  RO