/ Hex Artifact Content
Login

Artifact a82505be158d8ce42b38dcc9b426187d776904c12cdc68dc8925e1dfcc5cb6ce:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0ce0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
0cf0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0d00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0d30: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64  <errno.h>.#if !d
0d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
0d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
0d70: 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  0.# include <sys
0d80: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
0d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
0da0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0db0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0dc0: 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ioctl.h>.# inclu
0dd0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
0de0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70  # include <sys/p
0df0: 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  aram.h>.#endif /
0e00: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
0e10: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
0e20: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0e30: 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f  APPLE__) && ((__
0e40: 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
0e50: 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20  _MIN_REQUIRED > 
0e60: 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20  1050) || \.     
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f        (__IPHONE_
0e90: 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  OS_VERSION_MIN_R
0ea0: 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29 29  EQUIRED > 2000))
0eb0: 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65 64  .#  if (!defined
0ec0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0ed0: 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54 5f  DED) || (TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29 29  OS_EMBEDDED==0))
0ef0: 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21 64   \.       && (!d
0f00: 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49 50  efined(TARGET_IP
0f10: 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29 20  HONE_SIMULATOR) 
0f20: 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f 4e  || (TARGET_IPHON
0f30: 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29 29  E_SIMULATOR==0))
0f40: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41 56  .#    define HAV
0f50: 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a  E_GETHOSTUUID 1.
0f60: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61 72  #  else.#    war
0f70: 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75 69  ning "gethostuui
0f80: 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2e  d() is disabled.
0f90: 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ".#  endif.#endi
0fa0: 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  f...#if OS_VXWOR
0fb0: 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  KS.# include <sy
0fc0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63  s/ioctl.h>.# inc
0fd0: 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e  lude <semaphore.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c 69  h>.# include <li
0ff0: 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  mits.h>.#endif /
1000: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1010: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1020: 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
1030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1040: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1050: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1060: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41  endif..#ifdef HA
1070: 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75  VE_UTIME.# inclu
1080: 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e  de <utime.h>.#en
1090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
10a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
10b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
10c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
10d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
10e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
10f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1100: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1110: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1120: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1130: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1140: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1150: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1160: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1170: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1180: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1190: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
11a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
11b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
11c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
11d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
11e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1200: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1210: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1220: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1230: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1240: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
1250: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1260: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1270: 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65  xy dir.*/.#ifnde
1280: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1290: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
12a0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
12b0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
12c0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
12d0: 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a  NS 0755.#endif..
12e0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75  /*.** Maximum su
12f0: 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e  pported path-len
1300: 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  gth..*/.#define 
1310: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32  MAX_PATHNAME 512
1320: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
1330: 73 75 70 70 6f 72 74 65 64 20 73 79 6d 62 6f 6c  supported symbol
1340: 69 63 20 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65 66  ic links.*/.#def
1350: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ine SQLITE_MAX_S
1360: 59 4d 4c 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a 20  YMLINKS 100../* 
1370: 41 6c 77 61 79 73 20 63 61 73 74 20 74 68 65 20  Always cast the 
1380: 67 65 74 70 69 64 28 29 20 72 65 74 75 72 6e 20  getpid() return 
1390: 74 79 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  type for compati
13a0: 62 69 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b  bility with.** k
13b0: 65 72 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e  ernel modules in
13c0: 20 56 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65   VxWorks. */.#de
13d0: 66 69 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29  fine osGetpid(X)
13e0: 20 28 70 69 64 5f 74 29 67 65 74 70 69 64 28 29   (pid_t)getpid()
13f0: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74  ../*.** Only set
1400: 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69   the lastErrno i
1410: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
1420: 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72   is a real error
1430: 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e   and not .** a n
1440: 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72  ormal expected r
1450: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
1460: 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
1470: 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e  ITE_OK.*/.#defin
1480: 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  e IS_LOCK_ERROR(
1490: 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54  x)  ((x != SQLIT
14a0: 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53  E_OK) && (x != S
14b0: 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a  QLITE_BUSY))../*
14c0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
14d0: 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ces */.typedef s
14e0: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e  truct unixShm un
14f0: 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  ixShm;          
1500: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1510: 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
1520: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1530: 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75  ct unixShmNode u
1540: 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20  nixShmNode;     
1550: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1560: 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74  ry instance */.t
1570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1580: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78  ixInodeInfo unix
1590: 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20  InodeInfo;   /* 
15a0: 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70  An i-node */.typ
15b0: 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78  edef struct Unix
15c0: 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75  UnusedFd UnixUnu
15d0: 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e  sedFd;     /* An
15e0: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
15f0: 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a  criptor */../*.*
1600: 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74  * Sometimes, aft
1610: 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65  er a file handle
1620: 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51   is closed by SQ
1630: 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64  Lite, the file d
1640: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e  escriptor.** can
1650: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
1660: 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68  mediately. In th
1670: 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61  ese cases, insta
1680: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
1690: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
16a0: 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  re are used to s
16b0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65  tore the file de
16c0: 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77  scriptor while w
16d0: 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a  aiting for an.**
16e0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
16f0: 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20  either close or 
1700: 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72  reuse it..*/.str
1710: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1720: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1740: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1750: 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  r to close */.  
1760: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
1770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1780: 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73  gs this file des
1790: 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e  criptor was open
17a0: 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69  ed with */.  Uni
17b0: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
17c0: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  ;      /* Next u
17d0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
17e0: 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69  iptor on same fi
17f0: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
1800: 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  The unixFile str
1810: 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61  ucture is subcla
1820: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1830: 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  le specific to t
1840: 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69  he unix.** VFS i
1850: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
1860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1870: 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46  t unixFile unixF
1880: 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78  ile;.struct unix
1890: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
18a0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
18b0: 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20  t *pMethod;  /* 
18c0: 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  Always the first
18d0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
18e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74 20  /* The VFS that 
1910: 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e 69  created this uni
1920: 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49  xFile */.  unixI
1930: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1950: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1960: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1970: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19b0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
19c0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19e0: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
19f0: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1a00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  .  unsigned shor
1a10: 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b  t int ctrlFlags;
1a20: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1a30: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1a40: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1a50: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1a80: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1a90: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1aa0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1ab0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1ac0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1ad0: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1ae0: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1af0: 75 73 65 64 46 64 20 2a 70 50 72 65 61 6c 6c 6f  usedFd *pPreallo
1b00: 63 61 74 65 64 55 6e 75 73 65 64 3b 20 20 2f 2a  catedUnused;  /*
1b10: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1b20: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1b40: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1b50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b60: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1b70: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ba0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1bb0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1bc0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1bf0: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1c00: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1c10: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1c20: 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b    int nFetchOut;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c50: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  of outstanding x
1c60: 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20  Fetch refs */.  
1c70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1c80: 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  apSize;         
1c90: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
1ca0: 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74  ze of mapping at
1cb0: 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20   pMapRegion */. 
1cc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1cd0: 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20  mapSizeActual;  
1ce0: 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73       /* Actual s
1cf0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
1d00: 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  t pMapRegion */.
1d10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1d20: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
1d30: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
1d40: 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  red FCNTL_MMAP_S
1d50: 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76  IZE value */.  v
1d60: 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b  oid *pMapRegion;
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
1d90: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65  ped region */.#e
1da0: 6e 64 69 66 0a 20 20 69 6e 74 20 73 65 63 74 6f  ndif.  int secto
1db0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1dd0: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1de0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1df0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1e10: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1e20: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e30: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1e40: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e50: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1e60: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e80: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1e90: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1ea0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1eb0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1ec0: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
1ed0: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
1ee0: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c  /* cached detail
1f10: 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20  s from statfs() 
1f20: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
1f30: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
1f40: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
1f50: 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *pId;          /
1f60: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
1f70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
1f80: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1f90: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f   /* The next gro
1fa0: 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20  up of variables 
1fb0: 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63  are used to trac
1fc0: 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  k whether or not
1fd0: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
1fe0: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e  ction counter in
1ff0: 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20   bytes 24-27 of 
2000: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
2010: 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20  re updated.  ** 
2020: 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72  whenever any par
2030: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
2040: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61  e changes.  An a
2050: 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
2060: 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69  ill.  ** occur i
2070: 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61  f a file is upda
2080: 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f  ted without also
2090: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72   updating the tr
20a0: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
20b0: 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65  ounter.  This te
20c0: 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76  st is made to av
20d0: 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73  oid new problems
20e0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a   similar to the.
20f0: 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62    ** one describ
2100: 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
2110: 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69  84. .  */.  unsi
2120: 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43  gned char transC
2130: 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72  ntrChng;   /* Tr
2140: 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  ue if the transa
2150: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68  ction counter ch
2160: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
2170: 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74  ned char dbUpdat
2180: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  e;        /* Tru
2190: 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  e if any part of
21a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
21b0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
21c0: 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d  gned char inNorm
21d0: 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72  alWrite;   /* Tr
21e0: 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61  ue if in a norma
21f0: 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  l write operatio
2200: 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69  n */..#endif..#i
2210: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2220: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
2230: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
2240: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
2250: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
2260: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
2270: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
2280: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
2290: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
22a0: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
22b0: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
22c0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54  .#endif.};../* T
22d0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 6f 6c  his variable hol
22e0: 64 73 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  ds the process i
22f0: 64 20 28 70 69 64 29 20 66 72 6f 6d 20 77 68 65  d (pid) from whe
2300: 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  n the xRandomnes
2310: 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 77 61  s().** method wa
2320: 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 78 4f  s called.  If xO
2330: 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  pen() is called 
2340: 66 72 6f 6d 20 61 20 64 69 66 66 65 72 65 6e 74  from a different
2350: 20 70 72 6f 63 65 73 73 20 69 64 2c 0a 2a 2a 20   process id,.** 
2360: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2370: 61 20 66 6f 72 6b 28 29 20 68 61 73 20 6f 63 63  a fork() has occ
2380: 75 72 72 65 64 2c 20 74 68 65 20 50 52 4e 47 20  urred, the PRNG 
2390: 77 69 6c 6c 20 62 65 20 72 65 73 65 74 2e 0a 2a  will be reset..*
23a0: 2f 0a 73 74 61 74 69 63 20 70 69 64 5f 74 20 72  /.static pid_t r
23b0: 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 30  andomnessPid = 0
23c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
23d0: 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
23e0: 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61  unixFile.ctrlFla
23f0: 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23  gs bitmask:.*/.#
2400: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2410: 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31  EXCL        0x01
2420: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
2430: 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f  ons from one pro
2440: 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  cess only */.#de
2450: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44  fine UNIXFILE_RD
2460: 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20  ONLY      0x02  
2470: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2480: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
2490: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
24a0: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78  E_PERSIST_WAL 0x
24b0: 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73  04     /* Persis
24c0: 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  tent WAL mode */
24d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24e0: 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
24f0: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2500: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
2510: 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f  8     /* Directo
2520: 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a  ry sync needed *
2530: 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  /.#else.# define
2540: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2550: 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66  C    0x00.#endif
2560: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2570: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30 78  E_PSOW        0x
2580: 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  10     /* SQLITE
2590: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
25a0: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64  _OVERWRITE */.#d
25b0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
25c0: 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30 20  ELETE      0x20 
25d0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
25e0: 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e   close */.#defin
25f0: 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20  e UNIXFILE_URI  
2600: 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20 20         0x40     
2610: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68  /* Filename migh
2620: 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61 72  t have query par
2630: 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  ameters */.#defi
2640: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  ne UNIXFILE_NOLO
2650: 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20 20  CK      0x80    
2660: 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c   /* Do no file l
2670: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2680: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2690: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
26a0: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
26b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
26c0: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
26d0: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
26e0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
26f0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
2700: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
2710: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
2720: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
2730: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2750: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2760: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2770: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2780: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2790: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
27a0: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
27b0: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
27c0: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
27d0: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
27e0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
27f0: 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63  The threadid mac
2800: 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74  ro resolves to t
2810: 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20  he thread-id or 
2820: 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a  to 0.  Used for.
2830: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
2840: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2850: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
2860: 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20  EADSAFE.#define 
2870: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
2880: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
2890: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
28a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
28b0: 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66 61 75  AVE_MREMAP defau
28c0: 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c  lts to true on L
28d0: 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65 20 65  inux and false e
28e0: 76 65 72 79 77 68 65 72 65 20 65 6c 73 65 2e 0a  verywhere else..
28f0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2900: 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69  HAVE_MREMAP).# i
2910: 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  f defined(__linu
2920: 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  x__) && defined(
2930: 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23 20 20  _GNU_SOURCE).#  
2940: 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d  define HAVE_MREM
2950: 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20 20 64  AP 1.# else.#  d
2960: 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41  efine HAVE_MREMA
2970: 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  P 0.# endif.#end
2980: 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63  if../*.** Explic
2990: 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20 36 34  itly call the 64
29a0: 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  -bit version of 
29b0: 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64 72 6f  lseek() on Andro
29c0: 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c  id. Otherwise, l
29d0: 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74 68 65  seek().** is the
29e0: 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f 6e 2c   32-bit version,
29f0: 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45 5f 4f   even if _FILE_O
2a00: 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73  FFSET_BITS=64 is
2a10: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
2a20: 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a  def __ANDROID__.
2a30: 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b 20 6c  # define lseek l
2a40: 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a 0a 23  seek64.#endif..#
2a50: 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
2a60: 2f 2a 0a 2a 2a 20 4c 69 6e 75 78 2d 73 70 65 63  /*.** Linux-spec
2a70: 69 66 69 63 20 49 4f 43 54 4c 20 6d 61 67 69 63  ific IOCTL magic
2a80: 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20 66 6f   numbers used fo
2a90: 72 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 46 32  r controlling F2
2aa0: 46 53 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 32  FS.*/.#define F2
2ab0: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 20 20  FS_IOCTL_MAGIC  
2ac0: 20 20 20 20 20 20 30 78 66 35 0a 23 64 65 66 69        0xf5.#defi
2ad0: 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52  ne F2FS_IOC_STAR
2ae0: 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 20  T_ATOMIC_WRITE  
2af0: 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54     _IO(F2FS_IOCT
2b00: 4c 5f 4d 41 47 49 43 2c 20 31 29 0a 23 64 65 66  L_MAGIC, 1).#def
2b10: 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 43 4f 4d  ine F2FS_IOC_COM
2b20: 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  MIT_ATOMIC_WRITE
2b30: 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43      _IO(F2FS_IOC
2b40: 54 4c 5f 4d 41 47 49 43 2c 20 32 29 0a 23 64 65  TL_MAGIC, 2).#de
2b50: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54  fine F2FS_IOC_ST
2b60: 41 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49  ART_VOLATILE_WRI
2b70: 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f  TE   _IO(F2FS_IO
2b80: 43 54 4c 5f 4d 41 47 49 43 2c 20 33 29 0a 23 64  CTL_MAGIC, 3).#d
2b90: 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 41  efine F2FS_IOC_A
2ba0: 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52  BORT_VOLATILE_WR
2bb0: 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49  ITE   _IO(F2FS_I
2bc0: 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 35 29 0a 23  OCTL_MAGIC, 5).#
2bd0: 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f  define F2FS_IOC_
2be0: 47 45 54 5f 46 45 41 54 55 52 45 53 20 20 20 20  GET_FEATURES    
2bf0: 20 20 20 20 20 20 20 5f 49 4f 52 28 46 32 46 53         _IOR(F2FS
2c00: 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 31 32  _IOCTL_MAGIC, 12
2c10: 2c 20 75 33 32 29 0a 23 64 65 66 69 6e 65 20 46  , u32).#define F
2c20: 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d  2FS_FEATURE_ATOM
2c30: 49 43 5f 57 52 49 54 45 20 30 78 30 30 30 34 0a  IC_WRITE 0x0004.
2c40: 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75  #endif /* __linu
2c50: 78 5f 5f 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44  x__ */.../*.** D
2c60: 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79  ifferent Unix sy
2c70: 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70  stems declare op
2c80: 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e  en() in differen
2c90: 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73  t ways.  Same us
2ca0: 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20  e.** open(const 
2cb0: 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74  char*,int,mode_t
2cc0: 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f  ).  Others use o
2cd0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
2ce0: 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65  int,...)..** The
2cf0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69   difference is i
2d00: 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73  mportant when us
2d10: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2d20: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
2d30: 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20  *.** The safest 
2d40: 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68  way to deal with
2d50: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
2d60: 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  to always use th
2d70: 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68  is wrapper.** wh
2d80: 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74  ich always has t
2d90: 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66  he same well-def
2da0: 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a  ined interface..
2db0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
2dc0: 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68  sixOpen(const ch
2dd0: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66  ar *zFile, int f
2de0: 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  lags, int mode){
2df0: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a  .  return open(z
2e00: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64  File, flags, mod
2e10: 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  e);.}../* Forwar
2e20: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
2e30: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
2e40: 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
2e50: 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  ar*, int*);.stat
2e60: 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61  ic int unixGetpa
2e70: 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f  gesize(void);../
2e80: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
2e90: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
2ea0: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
2eb0: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
2ec0: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
2ed0: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
2ee0: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
2ef0: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
2f00: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
2f10: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
2f20: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
2f30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
2f40: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
2f50: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
2f60: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
2f70: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
2f80: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
2f90: 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61  truct unix_sysca
2fa0: 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ll {.  const cha
2fb0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
2fc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2fd0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
2fe0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2ff0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
3000: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
3010: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
3020: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3030: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3040: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
3050: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
3060: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20  aSyscall[] = {. 
3070: 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20   { "open",      
3080: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3090: 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65  all_ptr)posixOpe
30a0: 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  n,  0  },.#defin
30b0: 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28  e osOpen      ((
30c0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
30d0: 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73  r*,int,int))aSys
30e0: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
30f0: 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20  )..  { "close", 
3100: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3110: 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73  syscall_ptr)clos
3120: 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  e,      0  },.#d
3130: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20  efine osClose   
3140: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29    ((int(*)(int))
3150: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
3160: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65  rent)..  { "acce
3170: 73 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ss",       (sqli
3180: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3190: 61 63 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d  access,     0  }
31a0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65  ,.#define osAcce
31b0: 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  ss    ((int(*)(c
31c0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29  onst char*,int))
31d0: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
31e0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63  rent)..  { "getc
31f0: 77 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wd",       (sqli
3200: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3210: 67 65 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d  getcwd,     0  }
3220: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63  ,.#define osGetc
3230: 77 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29  wd    ((char*(*)
3240: 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61  (char*,size_t))a
3250: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
3260: 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22  ent)..  { "stat"
3270: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3280: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73  e3_syscall_ptr)s
3290: 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c  tat,       0  },
32a0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20  .#define osStat 
32b0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
32c0: 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74  nst char*,struct
32d0: 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c   stat*))aSyscall
32e0: 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f  [4].pCurrent)../
32f0: 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63  *.** The DJGPP c
3300: 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d  ompiler environm
3310: 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79  ent looks mostly
3320: 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20   like Unix, but 
3330: 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20  it.** lacks the 
3340: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
3350: 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e  all.  So redefin
3360: 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20  e fcntl() to be 
3370: 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61  something.** tha
3380: 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  t always succeed
3390: 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  s.  This means t
33a0: 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73  hat locking does
33b0: 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72   not occur under
33c0: 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20  .** DJGPP.  But 
33d0: 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74  it is DOS - what
33e0: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
33f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
3400: 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22  PP__.  { "fstat"
3410: 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20  ,        0,     
3420: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d              0  }
3430: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
3440: 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65  t(a,b,c)    0.#e
3450: 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73  lse     .  { "fs
3460: 74 61 74 22 2c 20 20 20 20 20 20 20 20 28 73 71  tat",        (sq
3470: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3480: 72 29 66 73 74 61 74 2c 20 20 20 20 20 20 30 20  r)fstat,      0 
3490: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
34a0: 74 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29  tat     ((int(*)
34b0: 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74  (int,struct stat
34c0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70  *))aSyscall[5].p
34d0: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
34e0: 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22  .  { "ftruncate"
34f0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3500: 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63  scall_ptr)ftrunc
3510: 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  ate,  0  },.#def
3520: 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20  ine osFtruncate 
3530: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66  ((int(*)(int,off
3540: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  _t))aSyscall[6].
3550: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3560: 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28  fcntl",        (
3570: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3580: 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20  ptr)fcntl,      
3590: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
35a0: 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28  Fcntl     ((int(
35b0: 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29  *)(int,int,...))
35c0: 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72  aSyscall[7].pCur
35d0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64  rent)..  { "read
35e0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
35f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3600: 72 65 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d  read,       0  }
3610: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64  ,.#define osRead
3620: 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28        ((ssize_t(
3630: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
3640: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d  e_t))aSyscall[8]
3650: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3660: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
3670: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
3680: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3690: 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20  E.  { "pread",  
36a0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
36b0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64  yscall_ptr)pread
36c0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  ,      0  },.#el
36d0: 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20  se.  { "pread", 
36e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
36f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3700: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
3710: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
3720: 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65  read     ((ssize
3730: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
3740: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
3750: 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65  yscall[9].pCurre
3760: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3770: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
3780: 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20  { "pread64",    
3790: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
37a0: 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20  ll_ptr)pread64, 
37b0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
37c0: 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20   { "pread64",   
37d0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
37e0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
37f0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3800: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3810: 36 34 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28  64 ((ssize_t(*)(
3820: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
3830: 2c 6f 66 66 36 34 5f 74 29 29 61 53 79 73 63 61  ,off64_t))aSysca
3840: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
3850: 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20  ..  { "write",  
3860: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3870: 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65  yscall_ptr)write
3880: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3890: 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20  fine osWrite    
38a0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
38b0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
38c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ze_t))aSyscall[1
38d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
38e0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
38f0: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
3900: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
3910: 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22  YLE.  { "pwrite"
3920: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3930: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3940: 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ite,     0  },.#
3950: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3960: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3970: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3980: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3990: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
39a0: 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69  sPwrite    ((ssi
39b0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
39c0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
39d0: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
39f0: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
3a00: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3a10: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b  USE_PREAD64).  {
3a20: 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20   "pwrite64",    
3a30: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3a40: 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c 20  l_ptr)pwrite64, 
3a50: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3a60: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
3a70: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3a80: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3a90: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3aa0: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
3ab0: 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  64  ((ssize_t(*)
3ac0: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3ad0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74 29  ,size_t,off64_t)
3ae0: 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
3af0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
3b00: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  13].pCurrent).. 
3b10: 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20   { "fchmod",    
3b20: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3b30: 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20  all_ptr)fchmod, 
3b40: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
3b50: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
3b60: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3b70: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3b80: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
3b90: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3ba0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3bb0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
3bc0: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
3bd0: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3be0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3bf0: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3c00: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3c10: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3c20: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c30: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3c40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c50: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3c60: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3c70: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3c80: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
3c90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3ca0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
3cb0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3cc0: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
3cd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3ce0: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3cf0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3d00: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3d10: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3d20: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3d30: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3d40: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3d50: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3d60: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3d70: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3d80: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3d90: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3da0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3db0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3dc0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3dd0: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3de0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3df0: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3e00: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3e10: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3e20: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3e30: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3e40: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3e50: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3e60: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3e70: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3e80: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3e90: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3ea0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3eb0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3ec0: 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e  ined(HAVE_FCHOWN
3ed0: 29 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20  ).  { "fchown", 
3ee0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3ef0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6f 77  yscall_ptr)fchow
3f00: 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  n,          0 },
3f10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68 6f  .#else.  { "fcho
3f20: 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wn",       (sqli
3f30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3f40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3f50: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
3f60: 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20 20 20  fine osFchown   
3f70: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69   ((int(*)(int,ui
3f80: 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79 73 63  d_t,gid_t))aSysc
3f90: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
3fa0: 29 0a 0a 20 20 7b 20 22 67 65 74 65 75 69 64 22  )..  { "geteuid"
3fb0: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
3fc0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 65  syscall_ptr)gete
3fd0: 75 69 64 2c 20 20 20 20 20 20 20 20 20 30 20 7d  uid,         0 }
3fe0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 65  ,.#define osGete
3ff0: 75 69 64 20 20 20 28 28 75 69 64 5f 74 28 2a 29  uid   ((uid_t(*)
4000: 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b  (void))aSyscall[
4010: 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  21].pCurrent)..#
4020: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4030: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
4040: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
4050: 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70  SIZE>0.  { "mmap
4060: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
4070: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
4080: 6d 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mmap,           
4090: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
40a0: 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20 20  "mmap",         
40b0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
40c0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
40d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
40e0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61 70  f.#define osMmap
40f0: 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64   ((void*(*)(void
4100: 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74  *,size_t,int,int
4110: 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ,int,off_t))aSys
4120: 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e  call[22].pCurren
4130: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
4140: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
4150: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
4160: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20  MMAP_SIZE>0.  { 
4170: 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20  "munmap",       
4180: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4190: 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20  _ptr)munmap,    
41a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
41b0: 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20  .  { "munmap",  
41c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
41d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
41e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
41f0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
4200: 73 4d 75 6e 6d 61 70 20 28 28 69 6e 74 28 2a 29  sMunmap ((int(*)
4210: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  (void*,size_t))a
4220: 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72  Syscall[23].pCur
4230: 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45 5f  rent)..#if HAVE_
4240: 4d 52 45 4d 41 50 20 26 26 20 28 21 64 65 66 69  MREMAP && (!defi
4250: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4260: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
4270: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a  AX_MMAP_SIZE>0).
4280: 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20    { "mremap",   
4290: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
42a0: 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70 2c  call_ptr)mremap,
42b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
42c0: 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61 70  else.  { "mremap
42d0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
42e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4300: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
4310: 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76 6f  ne osMremap ((vo
4320: 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a  id*(*)(void*,siz
4330: 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e  e_t,size_t,int,.
4340: 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d  ..))aSyscall[24]
4350: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4360: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4370: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
4380: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
4390: 45 3e 30 0a 20 20 7b 20 22 67 65 74 70 61 67 65  E>0.  { "getpage
43a0: 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33  size",  (sqlite3
43b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 69  _syscall_ptr)uni
43c0: 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20 30 20  xGetpagesize, 0 
43d0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 67 65  },.#else.  { "ge
43e0: 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71  tpagesize",  (sq
43f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4400: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
4410: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
4420: 64 65 66 69 6e 65 20 6f 73 47 65 74 70 61 67 65  define osGetpage
4430: 73 69 7a 65 20 28 28 69 6e 74 28 2a 29 28 76 6f  size ((int(*)(vo
4440: 69 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d  id))aSyscall[25]
4450: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4460: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41  defined(HAVE_REA
4470: 44 4c 49 4e 4b 29 0a 20 20 7b 20 22 72 65 61 64  DLINK).  { "read
4480: 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c 69  link",     (sqli
4490: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
44a0: 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20 20 20  readlink,       
44b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
44c0: 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20 20 20  "readlink",     
44d0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
44e0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
44f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4500: 66 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64  f.#define osRead
4510: 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74 28 2a  link ((ssize_t(*
4520: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 68  )(const char*,ch
4530: 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  ar*,size_t))aSys
4540: 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e  call[26].pCurren
4550: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4560: 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20 7b 20  HAVE_LSTAT).  { 
4570: 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "lstat",        
4580: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4590: 6c 5f 70 74 72 29 6c 73 74 61 74 2c 20 20 20 20  l_ptr)lstat,    
45a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
45b0: 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c 20 20 20  .  { "lstat",   
45c0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
45d0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
45e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
45f0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
4600: 73 4c 73 74 61 74 20 20 20 20 20 20 28 28 69 6e  sLstat      ((in
4610: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
4620: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
4630: 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72  Syscall[27].pCur
4640: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4650: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26  ed(__linux__) &&
4660: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4670: 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f  ENABLE_BATCH_ATO
4680: 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 7b 20 22  MIC_WRITE).  { "
4690: 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20 20 20  ioctl",         
46a0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
46b0: 5f 70 74 72 29 69 6f 63 74 6c 2c 20 20 20 20 20  _ptr)ioctl,     
46c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
46d0: 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 20 20 20    { "ioctl",    
46e0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
46f0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
4700: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4710: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
4720: 49 6f 63 74 6c 20 28 28 69 6e 74 28 2a 29 28 69  Ioctl ((int(*)(i
4730: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
4740: 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e  call[28].pCurren
4750: 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66  t)..}; /* End of
4760: 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c   the overrideabl
4770: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a  e system calls *
4780: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d  /.../*.** On som
4790: 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73  e systems, calls
47a0: 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69 6c   to fchown() wil
47b0: 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73 73  l trigger a mess
47c0: 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69 74  age in a securit
47d0: 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65 79  y.** log if they
47e0: 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72   come from non-r
47f0: 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20 20  oot processes.  
4800: 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67  So avoid calling
4810: 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20   fchown() if.** 
4820: 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69  we are not runni
4830: 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73  ng as root..*/.s
4840: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4850: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
4860: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
4870: 67 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  gid){.#if define
4880: 64 28 48 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20  d(HAVE_FCHOWN). 
4890: 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65 75 69   return osGeteui
48a0: 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63 68 6f  d() ? 0 : osFcho
48b0: 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a  wn(fd,uid,gid);.
48c0: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30  #else.  return 0
48d0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
48e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53  * This is the xS
48f0: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d  etSystemCall() m
4900: 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33  ethod of sqlite3
4910: 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  _vfs for all of 
4920: 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46  the.** "unix" VF
4930: 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Ses.  Return SQL
4940: 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63  ITE_OK opon succ
4950: 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e  essfully updatin
4960: 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  g the.** system 
4970: 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72  call pointer, or
4980: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
4990: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
49a0: 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20  configurable.** 
49b0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
49c0: 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
49d0: 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79  ic int unixSetSy
49e0: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
49f0: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
4a00: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
4a10: 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e   VFS pointer.  N
4a20: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
4a30: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
4a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4a50: 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c  me of system cal
4a60: 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f  l to override */
4a70: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
4a80: 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20  ll_ptr pNewFunc 
4a90: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
4aa0: 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76  ew system call v
4ab0: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  alue */.){.  uns
4ac0: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
4ad0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
4ae0: 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53  OTFOUND;..  UNUS
4af0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
4b00: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e  tUsed);.  if( zN
4b10: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
4b20: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
4b30: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
4b40: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
4b50: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
4b60: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
4b70: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
4b80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
4b90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4ba0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4bb0: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
4bc0: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4bd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4be0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4bf0: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
4c00: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4c10: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
4c20: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
4c30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
4c40: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  lse{.    /* If z
4c50: 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  Name is specifie
4c60: 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e  d, operate on on
4c70: 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65  ly the one syste
4c80: 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70  m call.    ** sp
4c90: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
4ca0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
4cb0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4cc0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4cd0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
4ce0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4cf0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4d00: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
4d10: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
4d20: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20  [i].pDefault==0 
4d30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79  ){.          aSy
4d40: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4d50: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
4d60: 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  pCurrent;.      
4d70: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
4d80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4d90: 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63      if( pNewFunc
4da0: 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d  ==0 ) pNewFunc =
4db0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4dc0: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61  fault;.        a
4dd0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4de0: 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a  ent = pNewFunc;.
4df0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4e00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4e10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4e20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
4e30: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73  e value of a sys
4e40: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
4e50: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20  n NULL if zName 
4e60: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f  is not a.** reco
4e70: 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61  gnized system ca
4e80: 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69  ll name.  NULL i
4e90: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
4ea0: 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  if the system ca
4eb0: 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ll.** is current
4ec0: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ly undefined..*/
4ed0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
4ee0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78  syscall_ptr unix
4ef0: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
4f00: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
4f10: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
4f20: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
4f30: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
4f40: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
4f50: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
4f60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4f70: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
4f80: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
4f90: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
4fa0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
4fb0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4fc0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
4fd0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4fe0: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
4ff0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
5000: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
5010: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
5020: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
5030: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
5040: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
5050: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
5060: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
5070: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
5080: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
5090: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
50a0: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
50b0: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
50c0: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
50d0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
50e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
50f0: 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65  r *unixNextSyste
5100: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
5110: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
5120: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
5130: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
5140: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
5150: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
5160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
5170: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
5180: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
5190: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
51a0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
51b0: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
51c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
51d0: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
51e0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
51f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
5200: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
5210: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
5220: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
5230: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5240: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  }../*.** Do not 
5250: 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20  accept any file 
5260: 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20  descriptor less 
5270: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
5280: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
5290: 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61  id.** opening da
52a0: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e  tabase file usin
52b0: 67 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  g file descripto
52c0: 72 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d  rs that are comm
52d0: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a  only used for .*
52e0: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  * standard input
52f0: 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72  , output, and er
5300: 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ror..*/.#ifndef 
5310: 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46  SQLITE_MINIMUM_F
5320: 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23  ILE_DESCRIPTOR.#
5330: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d   define SQLITE_M
5340: 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43  INIMUM_FILE_DESC
5350: 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a  RIPTOR 3.#endif.
5360: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70  ./*.** Invoke op
5370: 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c  en().  Do so mul
5380: 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74  tiple times, unt
5390: 69 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63  il it either suc
53a0: 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c  ceeds or.** fail
53b0: 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f  s for some reaso
53c0: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e  n other than EIN
53d0: 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  TR..**.** If the
53e0: 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d   file creation m
53f0: 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65  ode "m" is 0 the
5400: 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  n set it to the 
5410: 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53  default for.** S
5420: 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61  QLite.  The defa
5430: 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45  ult is SQLITE_DE
5440: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
5450: 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79  SSIONS (normally
5460: 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64  .** 0644) as mod
5470: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73  ified by the sys
5480: 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d  tem umask.  If m
5490: 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a   is not 0, then.
54a0: 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
54b0: 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62   creation mode b
54c0: 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f  e exactly m igno
54d0: 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a  ring the umask..
54e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61  **.** The m para
54f0: 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f  meter will be no
5500: 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e  n-zero only when
5510: 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20   creating -wal, 
5520: 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64  -journal,.** and
5530: 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65   -shm files.  We
5540: 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65   want those file
5550: 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74  s to have *exact
5560: 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  ly* the same.** 
5570: 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74  permissions as t
5580: 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
5590: 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65  tabase, unadulte
55a0: 72 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61  rated by the uma
55b0: 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77  sk..** In that w
55c0: 61 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73  ay, if a databas
55d0: 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77  e file is -rw-rw
55e0: 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d  -rw or -rw-rw-r-
55f0: 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73  , and a.** trans
5600: 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61  action crashes a
5610: 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64  nd leaves behind
5620: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74   hot journals, t
5630: 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65  hen any.** proce
5640: 73 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20  ss that is able 
5650: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
5660: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c  database will al
5670: 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a  so be able to.**
5680: 20 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74   recover the hot
5690: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74   journals..*/.st
56a0: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
56b0: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
56c0: 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f  *z, int f, mode_
56d0: 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a  t m){.  int fd;.
56e0: 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20    mode_t m2 = m 
56f0: 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46  ? m : SQLITE_DEF
5700: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
5710: 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31  SIONS;.  while(1
5720: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ){.#if defined(O
5730: 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64  _CLOEXEC).    fd
5740: 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f   = osOpen(z,f|O_
5750: 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c  CLOEXEC,m2);.#el
5760: 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70  se.    fd = osOp
5770: 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64  en(z,f,m2);.#end
5780: 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  if.    if( fd<0 
5790: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  ){.      if( err
57a0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74  no==EINTR ) cont
57b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61  inue;.      brea
57c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
57d0: 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49   fd>=SQLITE_MINI
57e0: 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50  MUM_FILE_DESCRIP
57f0: 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  TOR ) break;.   
5800: 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20   osClose(fd);.  
5810: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
5820: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20  LITE_WARNING, . 
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
5840: 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  attempt to open 
5850: 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64  \"%s\" as file d
5860: 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a  escriptor %d", z
5870: 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20  , fd);.    fd = 
5880: 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70  -1;.    if( osOp
5890: 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20  en("/dev/null", 
58a0: 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b  f, m)<0 ) break;
58b0: 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30  .  }.  if( fd>=0
58c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30   ){.    if( m!=0
58d0: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
58e0: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
58f0: 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
5900: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d  (fd, &statbuf)==
5910: 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61  0 .       && sta
5920: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a  tbuf.st_size==0.
5930: 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62         && (statb
5940: 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  uf.st_mode&0777)
5950: 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  !=m .      ){.  
5960: 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66        osFchmod(f
5970: 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d, m);.      }. 
5980: 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64     }.#if defined
5990: 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20  (FD_CLOEXEC) && 
59a0: 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45  (!defined(O_CLOE
59b0: 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45  XEC) || O_CLOEXE
59c0: 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74  C==0).    osFcnt
59d0: 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f  l(fd, F_SETFD, o
59e0: 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
59f0: 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
5a00: 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  XEC);.#endif.  }
5a10: 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a  .  return fd;.}.
5a20: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
5a30: 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
5a40: 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
5a50: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
5a60: 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
5a70: 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
5a80: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e  o protect the un
5a90: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a  ixInodeInfo and.
5aa0: 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ** vxworksFileId
5ab0: 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
5ac0: 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20   this file, all 
5ad0: 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  of which may be 
5ae0: 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75  .** shared by mu
5af0: 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
5b00: 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75  **.** Function u
5b10: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
5b20: 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
5b30: 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
5b40: 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
5b50: 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
5b60: 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
5b70: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
5b80: 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
5b90: 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
5ba0: 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
5bb0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
5bc0: 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
5bd0: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
5be0: 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65  );.**   unixEnte
5bf0: 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74  rLeave().*/.stat
5c00: 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65  ic void unixEnte
5c10: 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
5c20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
5c30: 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
5c40: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
5c50: 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29  EX_STATIC_VFS1))
5c60: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
5c70: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76  unixLeaveMutex(v
5c80: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
5c90: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
5ca0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
5cb0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5cc0: 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66 64  C_VFS1));.}.#ifd
5cd0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5ce0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
5cf0: 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
5d00: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5d10: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
5d20: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
5d30: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
5d40: 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e  IC_VFS1));.}.#en
5d50: 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  dif...#ifdef SQL
5d60: 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43  ITE_HAVE_OS_TRAC
5d70: 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  E./*.** Helper f
5d80: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e  unction for prin
5d90: 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69  ting out trace i
5da0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
5db0: 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e  debugging.** bin
5dc0: 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75  aries. This retu
5dd0: 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72  rns the string r
5de0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
5df0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a   the supplied.**
5e00: 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79   integer lock-ty
5e10: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  pe..*/.static co
5e20: 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65  nst char *azFile
5e30: 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f  Lock(int eFileLo
5e40: 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65  ck){.  switch( e
5e50: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
5e60: 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65  case NO_LOCK: re
5e70: 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20  turn "NONE";.   
5e80: 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43   case SHARED_LOC
5e90: 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45  K: return "SHARE
5ea0: 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53  D";.    case RES
5eb0: 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  ERVED_LOCK: retu
5ec0: 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20  rn "RESERVED";. 
5ed0: 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f     case PENDING_
5ee0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45  LOCK: return "PE
5ef0: 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65  NDING";.    case
5f00: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
5f10: 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49   return "EXCLUSI
5f20: 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VE";.  }.  retur
5f30: 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e  n "ERROR";.}.#en
5f40: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
5f50: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a  TE_LOCK_TRACE./*
5f60: 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e  .** Print out in
5f70: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
5f80: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  all locking oper
5f90: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
5fa0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5fb0: 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  ed for troublesh
5fc0: 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ooting locks on 
5fd0: 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a  multithreaded.**
5fe0: 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61   platforms.  Ena
5ff0: 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67  ble by compiling
6000: 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49   with the -DSQLI
6010: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a  TE_LOCK_TRACE.**
6020: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
6030: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70  tion on the comp
6040: 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65  iler.  This code
6050: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20   is normally.** 
6060: 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73  turned off..*/.s
6070: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72  tatic int lockTr
6080: 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ace(int fd, int 
6090: 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  op, struct flock
60a0: 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f   *p){.  char *zO
60b0: 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20  pName, *zType;. 
60c0: 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61   int s;.  int sa
60d0: 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20  vedErrno;.  if( 
60e0: 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20  op==F_GETLK ){. 
60f0: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45     zOpName = "GE
6100: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TLK";.  }else if
6110: 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b  ( op==F_SETLK ){
6120: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
6130: 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  SETLK";.  }else{
6140: 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c  .    s = osFcntl
6150: 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20  (fd, op, p);.   
6160: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
6170: 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f  ntf("fcntl unkno
6180: 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20  wn %d %d %d\n", 
6190: 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20  fd, op, s);.    
61a0: 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20  return s;.  }.  
61b0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
61c0: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _RDLCK ){.    zT
61d0: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
61e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
61f0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
6200: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52  .    zType = "WR
6210: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
6220: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( p->l_type==F_U
6230: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  NLCK ){.    zTyp
6240: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d  e = "UNLCK";.  }
6250: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6260: 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ( 0 );.  }.  ass
6270: 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65  ert( p->l_whence
6280: 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20  ==SEEK_SET );.  
6290: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
62a0: 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45  op, p);.  savedE
62b0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
62c0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
62d0: 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20  tf("fcntl %d %d 
62e0: 25 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25  %s %s %d %d %d %
62f0: 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61  d\n",.     threa
6300: 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65  did, fd, zOpName
6310: 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d  , zType, (int)p-
6320: 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70  >l_start, (int)p
6330: 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69  ->l_len,.     (i
6340: 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b  nt)p->l_pid, s);
6350: 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26  .  if( s==(-1) &
6360: 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26  & op==F_SETLK &&
6370: 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52   (p->l_type==F_R
6380: 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70  DLCK || p->l_typ
6390: 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20  e==F_WRLCK) ){. 
63a0: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
63b0: 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b  l2;.    l2 = *p;
63c0: 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c  .    osFcntl(fd,
63d0: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a   F_GETLK, &l2);.
63e0: 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70      if( l2.l_typ
63f0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
6400: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
6410: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
6420: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
6430: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  WRLCK ){.      z
6440: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
6450: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
6460: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
6470: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
6480: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "UNLCK";.    }
6490: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
64a0: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20  rt( 0 );.    }. 
64b0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
64c0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69  rintf("fcntl-fai
64d0: 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20  lure-reason: %s 
64e0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
64f0: 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29      zType, (int)
6500: 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  l2.l_start, (int
6510: 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29  )l2.l_len, (int)
6520: 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20  l2.l_pid);.  }. 
6530: 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72   errno = savedEr
6540: 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  rno;.  return s;
6550: 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74  .}.#undef osFcnt
6560: 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  l.#define osFcnt
6570: 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64  l lockTrace.#end
6580: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  if /* SQLITE_LOC
6590: 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  K_TRACE */../*.*
65a0: 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74  * Retry ftruncat
65b0: 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  e() calls that f
65c0: 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52  ail due to EINTR
65d0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73  .**.** All calls
65e0: 20 74 6f 20 66 74 72 75 6e 63 61 74 65 28 29 20   to ftruncate() 
65f0: 77 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65  within this file
6600: 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 20   should be made 
6610: 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20  through.** this 
6620: 77 72 61 70 70 65 72 2e 20 20 4f 6e 20 74 68 65  wrapper.  On the
6630: 20 41 6e 64 72 6f 69 64 20 70 6c 61 74 66 6f 72   Android platfor
6640: 6d 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65  m, bypassing the
6650: 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20   logic below.** 
6660: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
6670: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6690: 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
66a0: 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f  (int h, sqlite3_
66b0: 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74  int64 sz){.  int
66c0: 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e   rc;.#ifdef __AN
66d0: 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  DROID__.  /* On 
66e0: 41 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e 63 61  Android, ftrunca
66f0: 74 65 28 29 20 61 6c 77 61 79 73 20 75 73 65 73  te() always uses
6700: 20 33 32 2d 62 69 74 20 6f 66 66 73 65 74 73 2c   32-bit offsets,
6710: 20 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f   even if .  ** _
6720: 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53  FILE_OFFSET_BITS
6730: 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e 20  =64 is defined. 
6740: 54 68 69 73 20 6d 65 61 6e 73 20 69 74 20 69 73  This means it is
6750: 20 75 6e 73 61 66 65 20 74 6f 20 61 74 74 65 6d   unsafe to attem
6760: 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63  pt to.  ** trunc
6770: 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 61 6e  ate a file to an
6780: 79 20 73 69 7a 65 20 6c 61 72 67 65 72 20 74 68  y size larger th
6790: 61 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c  an 2GiB. Silentl
67a0: 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a  y ignore any.  *
67b0: 2a 20 73 75 63 68 20 61 74 74 65 6d 70 74 73 2e  * such attempts.
67c0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73    */.  if( sz>(s
67d0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37  qlite3_int64)0x7
67e0: 46 46 46 46 46 46 46 20 29 7b 0a 20 20 20 20 72  FFFFFFF ){.    r
67f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6800: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
6810: 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e  do{ rc = osFtrun
6820: 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69  cate(h,sz); }whi
6830: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
6840: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65  o==EINTR );.  re
6850: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6860: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74  * This routine t
6870: 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e  ranslates a stan
6880: 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f  dard POSIX errno
6890: 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74   code into somet
68a0: 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74  hing.** useful t
68b0: 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66  o the clients of
68c0: 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e   the sqlite3 fun
68d0: 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69  ctions.  Specifi
68e0: 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20  cally, it is.** 
68f0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e  intended to tran
6900: 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20  slate a variety 
6910: 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65  of "try again" e
6920: 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54  rrors into SQLIT
6930: 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20  E_BUSY.** and a 
6940: 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61  variety of "plea
6950: 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  se close the fil
6960: 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57  e descriptor NOW
6970: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a  " errors into .*
6980: 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a  * SQLITE_IOERR.*
6990: 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72  * .** Errors dur
69a0: 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ing initializati
69b0: 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20  on of locks, or 
69c0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
69d0: 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a  ort for locks,.*
69e0: 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20  * should handle 
69f0: 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c  ENOLCK, ENOTSUP,
6a00: 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61   EOPNOTSUPP sepa
6a10: 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rately..*/.stati
6a20: 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f  c int sqliteErro
6a30: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
6a40: 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20  int posixError, 
6a50: 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29  int sqliteIOErr)
6a60: 20 7b 0a 20 20 61 73 73 65 72 74 28 20 28 73 71   {.  assert( (sq
6a70: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
6a80: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20  ITE_IOERR_LOCK) 
6a90: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 73  || .          (s
6aa0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
6ab0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
6ac0: 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  K) || .         
6ad0: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
6ae0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
6af0: 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20  LOCK) ||.       
6b00: 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20     (sqliteIOErr 
6b10: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
6b20: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
6b30: 4b 29 20 29 3b 0a 20 20 73 77 69 74 63 68 20 28  K) );.  switch (
6b40: 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20  posixError) {.  
6b50: 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20  case EACCES: .  
6b60: 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63  case EAGAIN:.  c
6b70: 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20  ase ETIMEDOUT:. 
6b80: 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63   case EBUSY:.  c
6b90: 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73  ase EINTR:.  cas
6ba0: 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20  e ENOLCK:  .    
6bb0: 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65  /* random NFS re
6bc0: 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73  try error, unles
6bd0: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
6be0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20  stem support .  
6bf0: 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69     * introspecti
6c00: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20  on, in which it 
6c10: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
6c20: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20  hat it says */. 
6c30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6c40: 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61  _BUSY;.    .  ca
6c50: 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72  se EPERM: .    r
6c60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
6c70: 4d 3b 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c  M;.    .  defaul
6c80: 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73  t: .    return s
6c90: 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a  qliteIOErr;.  }.
6ca0: 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cf0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
6d00: 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69  ****** Begin Uni
6d10: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
6d20: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
6d30: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
6d40: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73  ***.**.** On mos
6d50: 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e  t versions of un
6d60: 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61  ix, we can get a
6d70: 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61   unique ID for a
6d80: 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65   file by concate
6d90: 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65  nating.** the de
6da0: 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  vice number and 
6db0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
6dc0: 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73  .  But this does
6dd0: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
6de0: 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f  orks..** On VxWo
6df0: 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69  rks, a unique fi
6e00: 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61  le id must be ba
6e10: 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e  sed on the canon
6e20: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a  ical filename..*
6e30: 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
6e40: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
6e50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
6e60: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
6e70: 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69  used as a.** uni
6e80: 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56  que file ID in V
6e90: 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e  xWorks.  Each in
6ea0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
6eb0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
6ec0: 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74  s.** a copy of t
6ed0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
6ee0: 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73  ename.  There is
6ef0: 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63   also a referenc
6f00: 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68  e count.  .** Th
6f10: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  e structure is r
6f20: 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68  eclaimed when th
6f30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  e number of poin
6f40: 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73  ters to it drops
6f50: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a   to.** zero..**.
6f60: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76  ** There are nev
6f70: 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c  er very many fil
6f80: 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74  es open at one t
6f90: 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20  ime and lookups 
6fa0: 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72  are not.** a per
6fb0: 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61  formance-critica
6fc0: 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73  l path, so it is
6fd0: 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70   sufficient to p
6fe0: 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75  ut these.** stru
6ff0: 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b  ctures on a link
7000: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75  ed list..*/.stru
7010: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7020: 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f   {.  struct vxwo
7030: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74  rksFileId *pNext
7040: 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20  ;  /* Next in a 
7050: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
7060: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7090: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
70a0: 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74  his one */.  int
70b0: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
70c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
70d0: 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e  ngth of the zCan
70e0: 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72  onicalName[] str
70f0: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ing */.  char *z
7100: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20  CanonicalName;  
7110: 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69         /* Canoni
7120: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  cal filename */.
7130: 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  };..#if OS_VXWOR
7140: 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e  KS./* .** All un
7150: 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  ique filenames a
7160: 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e  re held on a lin
7170: 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20  ked list headed 
7180: 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  by this.** varia
7190: 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ble:.*/.static s
71a0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
71b0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65  eId *vxworksFile
71c0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
71d0: 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65   Simplify a file
71e0: 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61  name into its ca
71f0: 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20  nonical form.** 
7200: 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f  by making the fo
7210: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a  llowing changes:
7220: 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69  .**.**  * removi
7230: 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ng any trailing 
7240: 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a  and duplicate /.
7250: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e  **  * convert /.
7260: 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  / into just /.**
7270: 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e    * convert /A/.
7280: 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e  ./ where A is an
7290: 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e  y simple name in
72a0: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20  to just /.**.** 
72b0: 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  Changes are made
72c0: 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75   in-place.  Retu
72d0: 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20  rn the new name 
72e0: 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  length..**.** Th
72f0: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e  e original filen
7300: 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e  ame is in z[0..n
7310: 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  -1].  Return the
7320: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68   number of.** ch
7330: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
7340: 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e  simplified name.
7350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
7360: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
7370: 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  me(char *z, int 
7380: 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  n){.  int i, j;.
7390: 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
73a0: 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e  z[n-1]=='/' ){ n
73b0: 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  --; }.  for(i=j=
73c0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
73d0: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20    if( z[i]=='/' 
73e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
73f0: 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69  +1]=='/' ) conti
7400: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  nue;.      if( z
7410: 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b  [i+1]=='.' && i+
7420: 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27  2<n && z[i+2]=='
7430: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  /' ){.        i 
7440: 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 1;.        co
7450: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
7460: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
7470: 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26  =='.' && i+3<n &
7480: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26  & z[i+2]=='.' &&
7490: 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a   z[i+3]=='/' ){.
74a0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
74b0: 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f  >0 && z[j-1]!='/
74c0: 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ j--; }.    
74d0: 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a      if( j>0 ){ j
74e0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20  --; }.        i 
74f0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 2;.        co
7500: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
7510: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d      }.    z[j++]
7520: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a   = z[i];.  }.  z
7530: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [j] = 0;.  retur
7540: 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  n j;.}../*.** Fi
7550: 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65  nd a unique file
7560: 20 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65   ID for the give
7570: 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e  n absolute pathn
7580: 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ame.  Return.** 
7590: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
75a0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
75b0: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69  bject.  This poi
75c0: 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71  nter is the uniq
75d0: 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a  ue.** file ID..*
75e0: 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69  *.** The nRef fi
75f0: 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72  eld of the vxwor
7600: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
7610: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  is incremented b
7620: 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a  efore.** the obj
7630: 65 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ect is returned.
7640: 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46    A new vxworksF
7650: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
7660: 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61  created.** and a
7670: 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62  dded to the glob
7680: 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73  al list if neces
7690: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sary..**.** If a
76a0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
76b0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
76c0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
76d0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
76e0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
76f0: 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
7700: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73  const char *zAbs
7710: 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74  oluteName){.  st
7720: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7730: 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  Id *pNew;       
7740: 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20    /* search key 
7750: 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20  and new file ID 
7760: 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  */.  struct vxwo
7770: 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64  rksFileId *pCand
7780: 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20  idate;   /* For 
7790: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69  looping over exi
77a0: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a  sting file IDs *
77b0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
77e0: 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61  h of zAbsoluteNa
77f0: 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20  me string */..  
7800: 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74  assert( zAbsolut
7810: 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  eName[0]=='/' );
7820: 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  .  n = (int)strl
7830: 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  en(zAbsoluteName
7840: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
7850: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
7860: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e  zeof(*pNew) + (n
7870: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  +1) );.  if( pNe
7880: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
7890: 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  .  pNew->zCanoni
78a0: 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  calName = (char*
78b0: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d  )&pNew[1];.  mem
78c0: 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  cpy(pNew->zCanon
78d0: 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c  icalName, zAbsol
78e0: 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20  uteName, n+1);. 
78f0: 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70   n = vxworksSimp
7900: 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a  lifyName(pNew->z
7910: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
7920: 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20  );..  /* Search 
7930: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
7940: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
7950: 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61  ing the canonica
7960: 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20  l name..  ** If 
7970: 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74  found, increment
7980: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
7990: 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ount and return 
79a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a  a pointer to.  *
79b0: 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66  * the existing f
79c0: 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75  ile ID..  */.  u
79d0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
79e0: 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74  .  for(pCandidat
79f0: 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  e=vxworksFileLis
7a00: 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70  t; pCandidate; p
7a10: 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69  Candidate=pCandi
7a20: 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  date->pNext){.  
7a30: 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65    if( pCandidate
7a40: 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20  ->nName==n .    
7a50: 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64   && memcmp(pCand
7a60: 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61  idate->zCanonica
7a70: 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61  lName, pNew->zCa
7a80: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d  nonicalName, n)=
7a90: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
7aa0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
7ab0: 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e  ew);.       pCan
7ac0: 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  didate->nRef++;.
7ad0: 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
7ae0: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
7af0: 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74  return pCandidat
7b00: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  e;.    }.  }..  
7b10: 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20  /* No match was 
7b20: 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20  found.  We will 
7b30: 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20  make a new file 
7b40: 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52  ID */.  pNew->nR
7b50: 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e  ef = 1;.  pNew->
7b60: 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65  nName = n;.  pNe
7b70: 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72  w->pNext = vxwor
7b80: 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78  ksFileList;.  vx
7b90: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
7ba0: 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76  pNew;.  unixLeav
7bb0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
7bc0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
7bd0: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
7be0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
7bf0: 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65  on a vxworksFile
7c00: 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65  Id object.  Free
7c10: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77  .** the object w
7c20: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
7c30: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
7c40: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
7c50: 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65  void vxworksRele
7c60: 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74  aseFileId(struct
7c70: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
7c80: 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65  pId){.  unixEnte
7c90: 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
7ca0: 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20  rt( pId->nRef>0 
7cb0: 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d  );.  pId->nRef--
7cc0: 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65  ;.  if( pId->nRe
7cd0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  f==0 ){.    stru
7ce0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7cf0: 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70   **pp;.    for(p
7d00: 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  p=&vxworksFileLi
7d10: 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d  st; *pp && *pp!=
7d20: 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70  pId; pp = &((*pp
7d30: 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20  )->pNext)){}.   
7d40: 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49   assert( *pp==pI
7d50: 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70  d );.    *pp = p
7d60: 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  Id->pNext;.    s
7d70: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29  qlite3_free(pId)
7d80: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
7d90: 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64  eMutex();.}.#end
7da0: 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
7db0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
7dc0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71  **** End of Uniq
7dd0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
7de0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
7df0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
7e00: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
7e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e50: 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
7e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ea0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
7eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ec0: 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79  * Posix Advisory
7ed0: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
7ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ef0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49  *****.**.** POSI
7f00: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
7f10: 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64   are broken by d
7f20: 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44  esign.  ANSI STD
7f30: 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a   1003.1 (1996).*
7f40: 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e  * section 6.5.2.
7f50: 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f  2 lines 483 thro
7f60: 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20  ugh 490 specify 
7f70: 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63  that when a proc
7f80: 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63  ess.** sets or c
7f90: 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68  lears a lock, th
7fa0: 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65  at operation ove
7fb0: 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72  rrides any prior
7fc0: 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79   locks set.** by
7fd0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
7fe0: 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  s.  It does not 
7ff0: 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73  explicitly say s
8000: 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c  o, but this impl
8010: 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f  ies.** that it o
8020: 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73  verrides locks s
8030: 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  et by the same p
8040: 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64  rocess using a d
8050: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
8060: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f   descriptor.  Co
8070: 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74  nsider this test
8080: 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   case:.**.**    
8090: 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65     int fd1 = ope
80a0: 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52  n("./file1", O_R
80b0: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
80c0: 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  4);.**       int
80d0: 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd2 = open("./f
80e0: 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile2", O_RDWR|O_
80f0: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
8100: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69  .** Suppose ./fi
8110: 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20  le1 and ./file2 
8120: 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73  are really the s
8130: 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73  ame file (becaus
8140: 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61  e.** one is a ha
8150: 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c  rd or symbolic l
8160: 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72  ink to the other
8170: 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65  ) then if you se
8180: 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76  t.** an exclusiv
8190: 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74  e lock on fd1, t
81a0: 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61  hen try to get a
81b0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
81c0: 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77  .** on fd2, it w
81d0: 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68  orks.  I would h
81e0: 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65  ave expected the
81f0: 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a   second lock to.
8200: 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68  ** fail since th
8210: 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  ere was already 
8220: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
8230: 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a  le due to fd1..*
8240: 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53  * But not so.  S
8250: 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20  ince both locks 
8260: 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61  came from the sa
8270: 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a  me process, the.
8280: 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69  ** second overri
8290: 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65  des the first, e
82a0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20  ven though they 
82b0: 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e  were on differen
82c0: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
82d0: 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20  ptors opened on 
82e0: 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e  different file n
82f0: 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ames..**.** This
8300: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63   means that we c
8310: 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20  annot use POSIX 
8320: 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f  locks to synchro
8330: 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73  nize file access
8340: 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74  .** among compet
8350: 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74  ing threads of t
8360: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
8370: 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69    POSIX locks wi
8380: 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20  ll work fine.** 
8390: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61  to synchronize a
83a0: 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64  ccess for thread
83b0: 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72  s in separate pr
83c0: 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74  ocesses, but not
83d0: 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68  .** threads with
83e0: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
83f0: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f  ess..**.** To wo
8400: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72  rk around the pr
8410: 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61  oblem, SQLite ha
8420: 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65  s to manage file
8430: 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c   locks internall
8440: 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e  y.** on its own.
8450: 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77    Whenever a new
8460: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
8470: 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ned, we have to 
8480: 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63  find the.** spec
8490: 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68  ific inode of th
84a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
84b0: 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65  (the inode is de
84c0: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a  termined by the.
84d0: 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74  ** st_dev and st
84e0: 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74  _ino fields of t
84f0: 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72  he stat structur
8500: 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66  e that fstat() f
8510: 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20  ills in).** and 
8520: 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20  check for locks 
8530: 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67  already existing
8540: 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20   on that inode. 
8550: 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a   When locks are.
8560: 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65  ** created or re
8570: 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74  moved, we have t
8580: 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77  o look at our ow
8590: 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  n internal recor
85a0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  d of the.** lock
85b0: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  s to see if anot
85c0: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70  her thread has p
85d0: 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20  reviously set a 
85e0: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d  lock on that sam
85f0: 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a  e.** inode..**.*
8600: 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73  * (Aside: The us
8610: 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65  e of inode numbe
8620: 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73  rs as unique IDs
8630: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
8640: 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f  n VxWorks..** Fo
8650: 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61  r VxWorks, we ha
8660: 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c  ve to use the al
8670: 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65  ternative unique
8680: 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64   ID system based
8690: 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c   on.** canonical
86a0: 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d   filename and im
86b0: 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65  plemented in the
86c0: 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69   previous divisi
86d0: 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  on.).**.** The s
86e0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
86f0: 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20  cture for POSIX 
8700: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73  is no longer jus
8710: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c  t an integer fil
8720: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e  e.** descriptor.
8730: 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74    It is now a st
8740: 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c  ructure that hol
8750: 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66  ds the integer f
8760: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
8770: 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  r and a pointer 
8780: 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74  to a structure t
8790: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
87a0: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f  e internal.** lo
87b0: 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  cks on the corre
87c0: 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20  sponding inode. 
87d0: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f   There is one lo
87e0: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a  cking structure.
87f0: 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f  ** per inode, so
8800: 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   if the same ino
8810: 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69  de is opened twi
8820: 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c  ce, both unixFil
8830: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
8840: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
8850: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
8860: 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ure.  The lockin
8870: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
8880: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
8890: 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69   count (so we wi
88a0: 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20  ll know when to 
88b0: 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61  delete it) and a
88c0: 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20   "cnt".** field 
88d0: 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74  that tells us it
88e0: 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  s internal lock 
88f0: 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20  status.  cnt==0 
8900: 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c  means the.** fil
8910: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  e is unlocked.  
8920: 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68  cnt==-1 means th
8930: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78  e file has an ex
8940: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a  clusive lock..**
8950: 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65   cnt>0 means the
8960: 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65  re are cnt share
8970: 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66  d locks on the f
8980: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61  ile..**.** Any a
8990: 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f  ttempt to lock o
89a0: 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  r unlock a file 
89b0: 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65  first checks the
89c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75   locking.** stru
89d0: 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74  cture.  The fcnt
89e0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  l() system call 
89f0: 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  is only invoked 
8a00: 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53  to set a .** POS
8a10: 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69  IX lock if the i
8a20: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72  nternal lock str
8a30: 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f  ucture transitio
8a40: 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20  ns between.** a 
8a50: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e  locked and an un
8a60: 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a  locked state..**
8a70: 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74  .** But wait:  t
8a80: 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72  here are yet mor
8a90: 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  e problems with 
8aa0: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
8ab0: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79  ocks..**.** If y
8ac0: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20  ou close a file 
8ad0: 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
8ae0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65  points to a file
8af0: 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c   that has locks,
8b00: 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e  .** all locks on
8b10: 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
8b20: 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65  are owned by the
8b30: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
8b40: 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64   are.** released
8b50: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
8b60: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20  d this problem, 
8b70: 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e  each unixInodeIn
8b80: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69  fo object.** mai
8b90: 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f  ntains a count o
8ba0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
8bb0: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e  pending locks on
8bc0: 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57   tha inode..** W
8bd0: 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
8be0: 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20  s made to close 
8bf0: 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20  an unixFile, if 
8c00: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68  there are.** oth
8c10: 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e  er unixFile open
8c20: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   on the same ino
8c30: 64 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64  de that are hold
8c40: 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63  ing locks, the c
8c50: 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28  all.** to close(
8c60: 29 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  ) the file descr
8c70: 69 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65  iptor is deferre
8c80: 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74  d until all of t
8c90: 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a  he locks clear..
8ca0: 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65  ** The unixInode
8cb0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b  Info structure k
8cc0: 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66  eeps a list of f
8cd0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
8ce0: 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20  that need to.** 
8cf0: 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68  be closed and th
8d00: 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65  at list is walke
8d10: 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20  d (and cleared) 
8d20: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
8d30: 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a  ck.** clears..**
8d40: 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20  .** Yet another 
8d50: 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54  problem:  LinuxT
8d60: 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c  hreads do not pl
8d70: 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73  ay well with pos
8d80: 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ix locks..**.** 
8d90: 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69  Many older versi
8da0: 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65  ons of linux use
8db0: 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64   the LinuxThread
8dc0: 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20  s library which 
8dd0: 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20  is.** not posix 
8de0: 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65  compliant.  Unde
8df0: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  r LinuxThreads, 
8e00: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
8e10: 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61  y thread.** A ca
8e20: 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64  nnot be modified
8e30: 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62   or overridden b
8e40: 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68  y a different th
8e50: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20  read B..** Only 
8e60: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64  thread A can mod
8e70: 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c  ify the lock.  L
8e80: 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20  ocking behavior 
8e90: 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66  is correct.** if
8ea0: 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20   the appliation 
8eb0: 75 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e  uses the newer N
8ec0: 61 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65  ative Posix Thre
8ed0: 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c  ad Library (NPTL
8ee0: 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20  ).** on linux - 
8ef0: 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b  with NPTL a lock
8f00: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
8f10: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
8f20: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68  e locks.** in th
8f30: 72 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65  read B.  But the
8f40: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
8f50: 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d  know at compile-
8f60: 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68  time which.** th
8f70: 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20  reading library 
8f80: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
8f90: 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  So there is no w
8fa0: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a  ay to know at.**
8fb0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
8fc0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72  ether or not thr
8fd0: 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69  ead A can overri
8fe0: 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65  de locks on thre
8ff0: 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73  ad B..** One has
9000: 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d   to do a run-tim
9010: 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f  e check to disco
9020: 76 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72  ver the behavior
9030: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   of the.** curre
9040: 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  nt process..**.*
9050: 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f  * SQLite used to
9060: 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68   support LinuxTh
9070: 72 65 61 64 73 2e 20 20 42 75 74 20 73 75 70 70  reads.  But supp
9080: 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72  ort for LinuxThr
9090: 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70  eads.** was drop
90a0: 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ped beginning wi
90b0: 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30  th version 3.7.0
90c0: 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73  .  SQLite will s
90d0: 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a  till work with.*
90e0: 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70  * LinuxThreads p
90f0: 72 6f 76 69 64 65 64 20 74 68 61 74 20 28 31 29  rovided that (1)
9100: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72   there is no mor
9110: 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65  e than one conne
9120: 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61  ction .** per da
9130: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
9140: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
9150: 61 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65  and (2) database
9160: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
9170: 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f  do not move acro
9180: 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a  ss threads..*/..
9190: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
91a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
91b0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72  ng structure ser
91c0: 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75  ves as the key u
91d0: 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65  sed.** to locate
91e0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e   a particular un
91f0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
9200: 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  ct..*/.struct un
9210: 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76  ixFileId {.  dev
9220: 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20  _t dev;         
9230: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
9240: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66  ce number */.#if
9250: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
9260: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
9270: 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69  Id *pId;  /* Uni
9280: 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20  que file ID for 
9290: 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73  vxworks. */.#els
92a0: 65 0a 20 20 2f 2a 20 57 65 20 61 72 65 20 74 6f  e.  /* We are to
92b0: 6c 64 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72  ld that some ver
92c0: 73 69 6f 6e 73 20 6f 66 20 41 6e 64 72 6f 69 64  sions of Android
92d0: 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67 20 74   contain a bug t
92e0: 68 61 74 0a 20 20 2a 2a 20 73 69 7a 65 73 20 69  hat.  ** sizes i
92f0: 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79 20 33 32 2d  no_t at only 32-
9300: 62 69 74 73 20 69 6e 73 74 65 61 64 20 6f 66 20  bits instead of 
9310: 36 34 2d 62 69 74 73 2e 20 28 53 65 65 0a 20 20  64-bits. (See.  
9320: 2a 2a 20 68 74 74 70 73 3a 2f 2f 61 6e 64 72 6f  ** https://andro
9330: 69 64 2d 72 65 76 69 65 77 2e 67 6f 6f 67 6c 65  id-review.google
9340: 73 6f 75 72 63 65 2e 63 6f 6d 2f 23 2f 63 2f 31  source.com/#/c/1
9350: 31 35 33 35 31 2f 33 2f 64 69 73 74 2f 73 71 6c  15351/3/dist/sql
9360: 69 74 65 33 2e 63 29 0a 20 20 2a 2a 20 54 6f 20  ite3.c).  ** To 
9370: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
9380: 2c 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74  , always allocat
9390: 65 20 36 34 2d 62 69 74 73 20 66 6f 72 20 74 68  e 64-bits for th
93a0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
93b0: 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d 61 6c 6c 20   .  ** On small 
93c0: 6d 61 63 68 69 6e 65 73 20 74 68 61 74 20 6f 6e  machines that on
93d0: 6c 79 20 68 61 76 65 20 33 32 2d 62 69 74 20 69  ly have 32-bit i
93e0: 6e 6f 64 65 73 2c 20 74 68 69 73 20 77 61 73 74  nodes, this wast
93f0: 65 73 20 34 20 62 79 74 65 73 2c 0a 20 20 2a 2a  es 4 bytes,.  **
9400: 20 62 75 74 20 74 68 61 74 20 73 68 6f 75 6c 64   but that should
9410: 20 6e 6f 74 20 62 65 20 61 20 62 69 67 20 64 65   not be a big de
9420: 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20 57 41 53 3a  al. */.  /* WAS:
9430: 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 2a    ino_t ino;   *
9440: 2f 0a 20 20 75 36 34 20 69 6e 6f 3b 20 20 20 20  /.  u64 ino;    
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9460: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
9470: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
9480: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
9490: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
94a0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
94b0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
94c0: 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  open.** inode.  
94d0: 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65  Or, on LinuxThre
94e0: 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e  ads, there is on
94f0: 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63  e of these struc
9500: 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63  tures for.** eac
9510: 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62  h inode opened b
9520: 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a  y each thread..*
9530: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
9540: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
9550: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
9560: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
9570: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
9580: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
9590: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
95a0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
95b0: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a  object and this.
95c0: 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20  ** object keeps 
95d0: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
95e0: 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c  umber of unixFil
95f0: 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74  e pointing to it
9600: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
9610: 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74  InodeInfo {.  st
9620: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
9630: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a  fileId;       /*
9640: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
9650: 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64  */.  int nShared
9660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9670: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9680: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
9690: 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  eld */.  unsigne
96a0: 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b  d char eFileLock
96b0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
96c0: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
96d0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
96e0: 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  c. */.  unsigned
96f0: 20 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f   char bProcessLo
9700: 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  ck;     /* An ex
9710: 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20  clusive process 
9720: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a  lock is held */.
9730: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9750: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
9760: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
9770: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75  structure */.  u
9780: 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
9790: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
97a0: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
97b0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
97c0: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
97d0: 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20  int nLock;      
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
9800: 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f  standing file lo
9810: 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  cks */.  UnixUnu
9820: 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20  sedFd *pUnused; 
9830: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
9840: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
9850: 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  ors to close */.
9860: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9870: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
9880: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
9890: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
98a0: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78  bjects */.  unix
98b0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76  InodeInfo *pPrev
98c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  ;           /*  
98d0: 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69    .... doubly li
98e0: 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49  nked */.#if SQLI
98f0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
9900: 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e  G_STYLE.  unsign
9910: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
9920: 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72  redByte;  /* for
9930: 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73   AFP simulated s
9940: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65  hared lock */.#e
9950: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ndif.#if OS_VXWO
9960: 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  RKS.  sem_t *pSe
9970: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
9980: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50        /* Named P
9990: 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a  OSIX semaphore *
99a0: 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d  /.  char aSemNam
99b0: 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
99c0: 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ];  /* Name of t
99d0: 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  hat semaphore */
99e0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
99f0: 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c  * A lists of all
9a00: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
9a10: 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
9a20: 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  c unixInodeInfo 
9a30: 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 20  *inodeList = 0; 
9a40: 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 49 6e 6f 64   /* All unixInod
9a50: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  eInfo objects */
9a60: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
9a70: 20 69 6e 74 20 6e 55 6e 75 73 65 64 46 64 20 3d   int nUnusedFd =
9a80: 20 30 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20   0;    /* Total 
9a90: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
9aa0: 72 69 70 74 6f 72 73 20 2a 2f 0a 0a 2f 2a 0a 2a  riptors */../*.*
9ab0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9ac0: 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  on - unixLogErro
9ad0: 72 41 74 4c 69 6e 65 28 29 2c 20 69 73 20 6f 6e  rAtLine(), is on
9ae0: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76  ly ever called v
9af0: 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20  ia the macro.** 
9b00: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a  unixLogError()..
9b10: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f  **.** It is invo
9b20: 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72  ked after an err
9b30: 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20  or occurs in an 
9b40: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  OS function and 
9b50: 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a  errno has been.*
9b60: 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61  * set. It logs a
9b70: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
9b80: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
9b90: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
9ba0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
9bb0: 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f  errno and, if po
9bc0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61  ssible, the huma
9bd0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76  n-readable equiv
9be0: 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72  alent from strer
9bf0: 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65  ror() or.** stre
9c00: 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  rror_r()..**.** 
9c10: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
9c20: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
9c30: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
9c40: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
9c50: 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  that.** will be 
9c60: 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
9c70: 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f  te (e.g. SQLITE_
9c80: 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51  IOERR_DELETE, SQ
9c90: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20  LITE_CANTOPEN). 
9ca0: 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73  .** The two subs
9cb0: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
9cc0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e   should be the n
9cd0: 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75  ame of the OS fu
9ce0: 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66  nction that.** f
9cf0: 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c  ailed (e.g. "unl
9d00: 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e  ink", "open") an
9d10: 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
9d20: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
9d30: 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f  h,.** if any..*/
9d40: 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67  .#define unixLog
9d50: 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20  Error(a,b,c)    
9d60: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9d70: 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45  ine(a,b,c,__LINE
9d80: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75  __).static int u
9d90: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
9da0: 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65  e(.  int errcode
9db0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9dc0: 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65       /* SQLite e
9dd0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  rror code */.  c
9de0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
9df0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9e00: 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e  * Name of OS fun
9e10: 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65  ction that faile
9e20: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
9e30: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
9e40: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70         /* File p
9e50: 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77  ath associated w
9e60: 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69  ith error */.  i
9e70: 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20  nt iLine        
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e90: 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75  * Source line nu
9ea0: 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72  mber where error
9eb0: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
9ec0: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20    char *zErr;   
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f    /* Message fro
9ef0: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20  m strerror() or 
9f00: 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20  equivalent */.  
9f10: 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72  int iErrno = err
9f20: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
9f30: 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c  /* Saved syscall
9f40: 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f   error number */
9f50: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
9f60: 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61  s not a threadsa
9f70: 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45  fe build (SQLITE
9f80: 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c  _THREADSAFE==0),
9f90: 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74   then use.  ** t
9fa0: 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75  he strerror() fu
9fb0: 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  nction to obtain
9fc0: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
9fd0: 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ble error messag
9fe0: 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e  e.  ** equivalen
9ff0: 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65  t to errno. Othe
a000: 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72  rwise, use strer
a010: 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23  ror_r()..  */ .#
a020: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
a030: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
a040: 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29  HAVE_STRERROR_R)
a050: 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d  .  char aErr[80]
a060: 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c  ;.  memset(aErr,
a070: 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29   0, sizeof(aErr)
a080: 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72  );.  zErr = aErr
a090: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52  ;..  /* If STRER
a0a0: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65  ROR_R_CHAR_P (se
a0b0: 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63  t by autoconf sc
a0c0: 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f  ripts) or __USE_
a0d0: 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a  GNU is defined,.
a0e0: 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
a0f0: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
a100: 69 64 65 73 20 74 68 65 20 47 4e 55 20 76 65 72  ides the GNU ver
a110: 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72  sion of strerror
a120: 5f 72 28 29 20 74 68 61 74 0a 20 20 2a 2a 20 72  _r() that.  ** r
a130: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
a140: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
a150: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f  taining the erro
a160: 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20  r message. That 
a170: 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61  pointer .  ** ma
a180: 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b  y point to aErr[
a190: 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69  ], or it may poi
a1a0: 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69  nt to some stati
a1b0: 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68  c storage somewh
a1c0: 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ere. .  ** Other
a1d0: 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  wise, assume tha
a1e0: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
a1f0: 76 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20  vides the POSIX 
a200: 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a  version of .  **
a210: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77   strerror_r(), w
a220: 68 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74  hich always writ
a230: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
a240: 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e  age into aErr[].
a250: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
a260: 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74  e code incorrect
a270: 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ly assumes that 
a280: 69 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20  it is the POSIX 
a290: 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a  version that is.
a2a0: 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20    ** available, 
a2b0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
a2c0: 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20  e will often be 
a2d0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
a2e0: 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65   Not a.  ** huge
a2f0: 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72   problem. Incorr
a300: 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67  ectly concluding
a310: 20 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65   that the GNU ve
a320: 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
a330: 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c  le .  ** could l
a340: 65 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c  ead to a segfaul
a350: 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23  t though..  */.#
a360: 69 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52  if defined(STRER
a370: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c  ROR_R_CHAR_P) ||
a380: 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47   defined(__USE_G
a390: 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20  NU).  zErr = .# 
a3a0: 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72  endif.  strerror
a3b0: 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c  _r(iErrno, aErr,
a3c0: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29   sizeof(aErr)-1)
a3d0: 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  ;..#elif SQLITE_
a3e0: 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20  THREADSAFE.  /* 
a3f0: 54 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64  This is a thread
a400: 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20  safe build, but 
a410: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20  strerror_r() is 
a420: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a  not available. *
a430: 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23  /.  zErr = "";.#
a440: 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68  else.  /* Non-th
a450: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
a460: 75 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20  use strerror(). 
a470: 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65  */.  zErr = stre
a480: 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65  rror(iErrno);.#e
a490: 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a 50 61 74  ndif..  if( zPat
a4a0: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
a4b0: 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  ";.  sqlite3_log
a4c0: 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20  (errcode,.      
a4d0: 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28  "os_unix.c:%d: (
a4e0: 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22  %d) %s(%s) - %s"
a4f0: 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69  ,.      iLine, i
a500: 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50  Errno, zFunc, zP
a510: 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a  ath, zErr.  );..
a520: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65    return errcode
a530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
a540: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
a550: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  or..**.** We ass
a560: 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29  ume that close()
a570: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77   almost always w
a580: 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69  orks, since it i
a590: 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76  s only in a.** v
a5a0: 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61  ery sick applica
a5b0: 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72  tion or on a ver
a5c0: 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20  y sick platform 
a5d0: 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61  that it might fa
a5e0: 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65  il..** If it doe
a5f0: 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c  s fail, simply l
a600: 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73  eak the file des
a610: 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20  criptor, but do 
a620: 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72  log the.** error
a630: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
a640: 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  t it is not safe
a650: 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28   to retry close(
a660: 29 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69  ) after EINTR si
a670: 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nce the.** file 
a680: 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74  descriptor might
a690: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
a6a0: 65 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f  en reused by ano
a6b0: 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20  ther thread..** 
a6c0: 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e  So we don't even
a6d0: 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20   try to recover 
a6e0: 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20  from an EINTR.  
a6f0: 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72  Just log the err
a700: 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f  or.** and move o
a710: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
a720: 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75  d robust_close(u
a730: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
a740: 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e  int h, int linen
a750: 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73  o){.  if( osClos
a760: 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78  e(h) ){.    unix
a770: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53  LogErrorAtLine(S
a780: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
a790: 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20  E, "close",.    
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65     pFile ? pFile
a7c0: 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e  ->zPath : 0, lin
a7d0: 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eno);.  }.}../*.
a7e0: 2a 2a 20 53 65 74 20 74 68 65 20 70 46 69 6c 65  ** Set the pFile
a7f0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f  ->lastErrno.  Do
a800: 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f   this in a subro
a810: 75 74 69 6e 65 20 61 73 20 74 68 61 74 20 70 72  utine as that pr
a820: 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f 6e 76  ovides.** a conv
a830: 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
a840: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
a850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a860: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
a870: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
a880: 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70   int error){.  p
a890: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
a8a0: 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  = error;.}../*.*
a8b0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  * Close all file
a8c0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63   descriptors acc
a8d0: 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75  umuated in the u
a8e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55  nixInodeInfo->pU
a8f0: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a  nused list..*/ .
a900: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
a910: 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78  ePendingFds(unix
a920: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
a930: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
a940: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
a950: 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75  Inode;.  UnixUnu
a960: 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78  sedFd *p;.  Unix
a970: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
a980: 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d  .  for(p=pInode-
a990: 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70  >pUnused; p; p=p
a9a0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
a9b0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
a9c0: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
a9d0: 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49  ile, p->fd, __LI
a9e0: 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74  NE__);.    sqlit
a9f0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
aa00: 6e 55 6e 75 73 65 64 46 64 2d 2d 3b 0a 20 20 7d  nUnusedFd--;.  }
aa10: 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
aa20: 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
aa30: 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49   Release a unixI
aa40: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
aa50: 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  re previously al
aa60: 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 49  located by findI
aa70: 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a  nodeInfo()..**.*
aa80: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
aa90: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
aaa0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
aab0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
aac0: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
aad0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
aae0: 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
aaf0: 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64  void releaseInod
ab00: 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a  eInfo(unixFile *
ab10: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
ab20: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
ab30: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
ab40: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
ab50: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
ab60: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64  if( ALWAYS(pInod
ab70: 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  e) ){.    pInode
ab80: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
ab90: 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  ( pInode->nRef==
aba0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
abb0: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  t( pInode->pShmN
abc0: 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ode==0 );.      
abd0: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
abe0: 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
abf0: 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20  ( pInode->pPrev 
ac00: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
ac10: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  t( pInode->pPrev
ac20: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20  ->pNext==pInode 
ac30: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
ac40: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  e->pPrev->pNext 
ac50: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
ac60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ac70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 6e        assert( in
ac80: 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20  odeList==pInode 
ac90: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65  );.        inode
aca0: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  List = pInode->p
acb0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
acc0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
acd0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
ace0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
acf0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
ad00: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
ad10: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
ad20: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e  pPrev = pInode->
ad30: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20  pPrev;.      }. 
ad40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ad50: 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d  e(pInode);.    }
ad60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
ad70: 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c 7c 20 6e  nodeList!=0 || n
ad80: 55 6e 75 73 65 64 46 64 3d 3d 30 20 29 3b 0a 7d  UnusedFd==0 );.}
ad90: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
ada0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
adb0: 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78   locate the unix
adc0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
add0: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
ade0: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
adf0: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
ae00: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
ae10: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
ae20: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69   return value mi
ae30: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
ae40: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
ae50: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
ae60: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
ae70: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
ae80: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
ae90: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
aea0: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
aeb0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
aec0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
aed0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
aee0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
aef0: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f  atic int findIno
af00: 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69  deInfo(.  unixFi
af10: 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
af20: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78           /* Unix
af30: 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20   file with file 
af40: 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65  desc used in the
af50: 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e   key */.  unixIn
af60: 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64  odeInfo **ppInod
af70: 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  e        /* Retu
af80: 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  rn the unixInode
af90: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65  Info object here
afa0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65          /* Syste
afd0: 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f  m call return co
afe0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  de */.  int fd; 
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
b010: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
b020: 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72  r pFile */.  str
b030: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
b040: 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c  ileId;      /* L
b050: 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68  ookup key for th
b060: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
b070: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
b080: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
b090: 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
b0a0: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
b0b0: 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  n */.  unixInode
b0c0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30  Info *pInode = 0
b0d0: 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61  ;     /* Candida
b0e0: 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  te unixInodeInfo
b0f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73   object */..  as
b100: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
b110: 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47  eld() );..  /* G
b120: 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66  et low-level inf
b130: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
b140: 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20  he file that we 
b150: 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a  can used to.  **
b160: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
b170: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69   name for the fi
b180: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20  le..  */.  fd = 
b190: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d  pFile->h;.  rc =
b1a0: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
b1b0: 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63  atbuf);.  if( rc
b1c0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65  !=0 ){.    store
b1d0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
b1e0: 20 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64 65 66   errno);.#if def
b1f0: 69 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57 29 20  ined(EOVERFLOW) 
b200: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
b210: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29 0a 20  E_DISABLE_LFS). 
b220: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61     if( pFile->la
b230: 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c  stErrno==EOVERFL
b240: 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  OW ) return SQLI
b250: 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66  TE_NOLFS;.#endif
b260: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b270: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23  TE_IOERR;.  }..#
b280: 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
b290: 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20    /* On OS X on 
b2a0: 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73  an msdos filesys
b2b0: 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e  tem, the inode n
b2c0: 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65  umber is reporte
b2d0: 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74  d.  ** incorrect
b2e0: 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65  ly for zero-size
b2f0: 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63   files.  See tic
b300: 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77  ket #3260.  To w
b310: 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20  ork.  ** around 
b320: 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65  this problem (we
b330: 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62   consider it a b
b340: 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20  ug in OS X, not 
b350: 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20  SQLite).  ** we 
b360: 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20  always increase 
b370: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f  the file size to
b380: 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20   1 by writing a 
b390: 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a  single byte.  **
b3a0: 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73   prior to access
b3b0: 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  ing the inode nu
b3c0: 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62  mber.  The one b
b3d0: 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20  yte written is. 
b3e0: 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27   ** an ASCII 'S'
b3f0: 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68   character which
b400: 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f   also happens to
b410: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79   be the first by
b420: 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68  te.  ** in the h
b430: 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53  eader of every S
b440: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
b450: 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66   In this way, if
b460: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61   there.  ** is a
b470: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
b480: 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65  such that anothe
b490: 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72  r thread has alr
b4a0: 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20  eady populated. 
b4b0: 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61   ** the first pa
b4c0: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
b4d0: 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73  se, no damage is
b4e0: 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   done..  */.  if
b4f0: 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  ( statbuf.st_siz
b500: 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e  e==0 && (pFile->
b510: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
b520: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
b530: 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b  S)!=0 ){.    do{
b540: 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
b550: 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c  , "S", 1); }whil
b560: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
b570: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69  ==EINTR );.    i
b580: 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  f( rc!=1 ){.    
b590: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
b5a0: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
b5b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b5c0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
b5d0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61  .    rc = osFsta
b5e0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
b5f0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
b600: 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
b610: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
b620: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rno);.      retu
b630: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
b640: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
b650: 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c  f..  memset(&fil
b660: 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  eId, 0, sizeof(f
b670: 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49  ileId));.  fileI
b680: 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  d.dev = statbuf.
b690: 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56  st_dev;.#if OS_V
b6a0: 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e  XWORKS.  fileId.
b6b0: 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64  pId = pFile->pId
b6c0: 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64  ;.#else.  fileId
b6d0: 2e 69 6e 6f 20 3d 20 28 75 36 34 29 73 74 61 74  .ino = (u64)stat
b6e0: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
b6f0: 69 66 0a 20 20 61 73 73 65 72 74 28 20 69 6e 6f  if.  assert( ino
b700: 64 65 4c 69 73 74 21 3d 30 20 7c 7c 20 6e 55 6e  deList!=0 || nUn
b710: 75 73 65 64 46 64 3d 3d 30 20 29 3b 0a 20 20 70  usedFd==0 );.  p
b720: 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73  Inode = inodeLis
b730: 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  t;.  while( pIno
b740: 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69  de && memcmp(&fi
b750: 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66  leId, &pInode->f
b760: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
b770: 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49  leId)) ){.    pI
b780: 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  node = pInode->p
b790: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
b7a0: 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  pInode==0 ){.   
b7b0: 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65   pInode = sqlite
b7c0: 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
b7d0: 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20  of(*pInode) );. 
b7e0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30     if( pInode==0
b7f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b800: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
b810: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  PT;.    }.    me
b820: 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20  mset(pInode, 0, 
b830: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29  sizeof(*pInode))
b840: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49  ;.    memcpy(&pI
b850: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66  node->fileId, &f
b860: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
b870: 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f  leId));.    pIno
b880: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
b890: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20    pInode->pNext 
b8a0: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
b8b0: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d   pInode->pPrev =
b8c0: 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64   0;.    if( inod
b8d0: 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73  eList ) inodeLis
b8e0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
b8f0: 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74  e;.    inodeList
b900: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c   = pInode;.  }el
b910: 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  se{.    pInode->
b920: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
b930: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b  pInode = pInode;
b940: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b950: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
b960: 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 46 69  turn TRUE if pFi
b970: 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61  le has been rena
b980: 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20  med or unlinked 
b990: 73 69 6e 63 65 20 69 74 20 77 61 73 20 66 69 72  since it was fir
b9a0: 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74  st opened..*/.st
b9b0: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73  atic int fileHas
b9c0: 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a  Moved(unixFile *
b9d0: 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56  pFile){.#if OS_V
b9e0: 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
b9f0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
ba00: 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d   && pFile->pId!=
ba10: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66  pFile->pInode->f
ba20: 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65  ileId.pId;.#else
ba30: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
ba40: 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69  uf;.  return pFi
ba50: 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26  le->pInode!=0 &&
ba60: 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70  .      (osStat(p
ba70: 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75  File->zPath, &bu
ba80: 66 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  f)!=0 .         
ba90: 7c 7c 20 28 75 36 34 29 62 75 66 2e 73 74 5f 69  || (u64)buf.st_i
baa0: 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  no!=pFile->pInod
bab0: 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a  e->fileId.ino);.
bac0: 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
bad0: 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69 6c   Check a unixFil
bae0: 65 20 74 68 61 74 20 69 73 20 61 20 64 61 74 61  e that is a data
baf0: 62 61 73 65 2e 20 20 56 65 72 69 66 79 20 74 68  base.  Verify th
bb00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
bb10: 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73 20  ** (1) There is 
bb20: 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72 64  exactly one hard
bb30: 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c   link on the fil
bb40: 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69 6c  e.** (2) The fil
bb50: 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f  e is not a symbo
bb60: 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20  lic link.** (3) 
bb70: 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  The file has not
bb80: 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72   been renamed or
bb90: 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20   unlinked.**.** 
bba0: 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f  Issue sqlite3_lo
bbb0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
bbc0: 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20 69  ,...) messages i
bbd0: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f  f anything is no
bbe0: 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  t right..*/.stat
bbf0: 69 63 20 76 6f 69 64 20 76 65 72 69 66 79 44 62  ic void verifyDb
bc00: 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
bc10: 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20  File){.  struct 
bc20: 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74 20  stat buf;.  int 
bc30: 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 73 65 20  rc;..  /* These 
bc40: 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 6f 63  verifications oc
bc50: 63 75 72 73 20 66 6f 72 20 74 68 65 20 6d 61 69  curs for the mai
bc60: 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20  n database only 
bc70: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
bc80: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
bc90: 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 20 72 65  FILE_NOLOCK ) re
bca0: 74 75 72 6e 3b 0a 0a 20 20 72 63 20 3d 20 6f 73  turn;..  rc = os
bcb0: 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
bcc0: 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  &buf);.  if( rc!
bcd0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
bce0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
bcf0: 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73  NING, "cannot fs
bd00: 74 61 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c  tat db file %s",
bd10: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
bd20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
bd30: 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69    if( buf.st_nli
bd40: 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  nk==0 ){.    sql
bd50: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
bd60: 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75  WARNING, "file u
bd70: 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70  nlinked while op
bd80: 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  en: %s", pFile->
bd90: 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75  zPath);.    retu
bda0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75  rn;.  }.  if( bu
bdb0: 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a  f.st_nlink>1 ){.
bdc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
bdd0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
bde0: 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20  "multiple links 
bdf0: 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46  to file: %s", pF
be00: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
be10: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
be20: 66 28 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28  f( fileHasMoved(
be30: 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 73 71  pFile) ){.    sq
be40: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
be50: 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20  _WARNING, "file 
be60: 72 65 6e 61 6d 65 64 20 77 68 69 6c 65 20 6f 70  renamed while op
be70: 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  en: %s", pFile->
be80: 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75  zPath);.    retu
be90: 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn;.  }.}.../*.*
bea0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
beb0: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
bec0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
bed0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
bee0: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
bef0: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
bf00: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
bf10: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
bf20: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
bf30: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
bf40: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
bf50: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
bf60: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
bf70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
bf80: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
bf90: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
bfa0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
bfb0: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
bfc0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
bfd0: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
bfe0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
bff0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
c000: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
c010: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c020: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
c030: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
c040: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
c050: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
c060: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
c070: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
c080: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
c090: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
c0a0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73  ( pFile );.  ass
c0b0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
c0c0: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
c0d0: 43 4b 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  CK );.  unixEnte
c0e0: 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
c0f0: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
c100: 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
c110: 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a  oss threads */..
c120: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
c130: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
c140: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
c150: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
c160: 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
c170: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
c180: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
c190: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
c1a0: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
c1b0: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
c1c0: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
c1d0: 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  it..  */.#ifndef
c1e0: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28   __DJGPP__.  if(
c1f0: 20 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70   !reserved && !p
c200: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
c210: 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20  rocessLock ){.  
c220: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
c230: 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ock;.    lock.l_
c240: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
c250: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
c260: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
c270: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
c280: 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63  len = 1;.    loc
c290: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
c2a0: 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63  CK;.    if( osFc
c2b0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
c2c0: 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b  GETLK, &lock) ){
c2d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
c2e0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
c2f0: 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20  SERVEDLOCK;.    
c300: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
c310: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
c320: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
c330: 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e  ock.l_type!=F_UN
c340: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LCK ){.      res
c350: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
c360: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
c370: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
c380: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
c390: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
c3a0: 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d %d (unix)\n", 
c3b0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
c3c0: 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52  served));..  *pR
c3d0: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
c3e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c3f0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
c400: 74 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d  to set a system-
c410: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
c420: 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63   pFile.  The loc
c430: 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62  k is .** describ
c440: 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a  ed by pLock..**.
c450: 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20  ** If the pFile 
c460: 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f  was opened read/
c470: 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d  write from unix-
c480: 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f  excl, then the o
c490: 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72  nly lock.** ever
c4a0: 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20   obtained is an 
c4b0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
c4c0: 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e  and it is obtain
c4d0: 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a  ed exactly once.
c4e0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ** the first tim
c4f0: 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74  e any lock is at
c500: 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75  tempted.  All su
c510: 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20  bsequent system 
c520: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  locking.** opera
c530: 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d  tions become no-
c540: 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70  ops.  Locking op
c550: 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68  erations still h
c560: 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79  appen internally
c570: 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  ,.** in order to
c580: 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65   coordinate acce
c590: 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72  ss between separ
c5a0: 61 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ate database con
c5b0: 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68  nections.** with
c5c0: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c  in this process,
c5d0: 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74   but all of that
c5e0: 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d   is handled in m
c5f0: 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a  emory and the.**
c600: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
c610: 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69  m does not parti
c620: 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cipate..**.** Th
c630: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
c640: 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f   pass-through to
c650: 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20   fcntl(F_SETLK) 
c660: 69 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e  if pFile is usin
c670: 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68  g.** any VFS oth
c680: 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78  er than "unix-ex
c690: 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20  cl" or if pFile 
c6a0: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e  is opened on "un
c6b0: 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20  ix-excl".** and 
c6c0: 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a  is read-only..**
c6d0: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
c6e0: 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c  rned if the call
c6f0: 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65   completes succe
c700: 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69  ssfully, or -1 i
c710: 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66  f a call.** to f
c720: 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e  cntl() fails. In
c730: 20 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e   this case, errn
c740: 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72  o is set appropr
c750: 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c  iately (by fcntl
c760: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
c770: 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  nt unixFileLock(
c780: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
c790: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
c7a0: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Lock){.  int rc;
c7b0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
c7c0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
c7d0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
c7e0: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
c7f0: 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d() );.  assert(
c800: 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20   pInode!=0 );.  
c810: 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  if( (pFile->ctrl
c820: 46 6c 61 67 73 20 26 20 28 55 4e 49 58 46 49 4c  Flags & (UNIXFIL
c830: 45 5f 45 58 43 4c 7c 55 4e 49 58 46 49 4c 45 5f  E_EXCL|UNIXFILE_
c840: 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e 49 58 46 49  RDONLY))==UNIXFI
c850: 4c 45 5f 45 58 43 4c 20 29 7b 0a 20 20 20 20 69  LE_EXCL ){.    i
c860: 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
c870: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
c880: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
c890: 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73   lock;.      ass
c8a0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
c8b0: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c  ck==0 );.      l
c8c0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
c8d0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
c8e0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
c8f0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
c900: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
c910: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
c920: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c930: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72  F_WRLCK;.      r
c940: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
c950: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
c960: 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  lock);.      if(
c970: 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72   rc<0 ) return r
c980: 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  c;.      pInode-
c990: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20  >bProcessLock = 
c9a0: 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  1;.      pInode-
c9b0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65  >nLock++;.    }e
c9c0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
c9d0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
c9e0: 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  {.    rc = osFcn
c9f0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
ca00: 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20  ETLK, pLock);.  
ca10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ca20: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
ca30: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
ca40: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
ca50: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
ca60: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
ca70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
ca80: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
ca90: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
caa0: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
cab0: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
cac0: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
cad0: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
cae0: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
caf0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
cb00: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
cb10: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
cb20: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
cb30: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
cb40: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
cb50: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
cb60: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
cb70: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
cb80: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
cb90: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
cba0: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
cbb0: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
cbc0: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
cbd0: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
cbe0: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
cbf0: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
cc00: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
cc10: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
cc20: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
cc30: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
cc40: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
cc50: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
cc60: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
cc70: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
cc80: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
cc90: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
cca0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
ccb0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
ccc0: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
ccd0: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
cce0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
ccf0: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
cd00: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
cd10: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
cd20: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
cd30: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
cd40: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
cd50: 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65   unixLock(sqlite
cd60: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
cd70: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a  eFileLock){.  /*
cd80: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
cd90: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
cda0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
cdb0: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
cdc0: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
cdd0: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
cde0: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
cdf0: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
ce00: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
ce10: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
ce20: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
ce30: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
ce40: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
ce50: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
ce60: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
ce70: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
ce80: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
ce90: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
cea0: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
ceb0: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
cec0: 74 69 62 6c 65 20 77 69 74 68 20 57 69 6e 64 6f  tible with Windo
ced0: 77 73 39 35 20 73 79 73 74 65 6d 73 20 73 69 6d  ws95 systems sim
cee0: 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a  ultaneously.  **
cef0: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
cf00: 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
cf10: 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20  e, in case that 
cf20: 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64  is ever required
cf30: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62  ..  **.  ** Symb
cf40: 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f  ols defined in o
cf50: 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68  s.h indentify th
cf60: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
cf70: 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76   and the 'reserv
cf80: 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65  ed.  ** byte', e
cf90: 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73  ach single bytes
cfa0: 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f   at well known o
cfb0: 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20  ffsets, and the 
cfc0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
cfd0: 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67  * range', a rang
cfe0: 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61  e of 510 bytes a
cff0: 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f  t a well known o
d000: 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ffset..  **.  **
d010: 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41   To obtain a SHA
d020: 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64  RED lock, a read
d030: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
d040: 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  d on the 'pendin
d050: 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49  g.  ** byte'.  I
d060: 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73  f this is succes
d070: 73 66 75 6c 2c 20 27 73 68 61 72 65 64 20 62 79  sful, 'shared by
d080: 74 65 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  te range' is rea
d090: 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a 2a 20 61 6e  d-locked.  ** an
d0a0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
d0b0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
d0c0: 20 72 65 6c 65 61 73 65 64 2e 20 20 28 4c 65 67   released.  (Leg
d0d0: 61 63 79 20 6e 6f 74 65 3a 20 20 57 68 65 6e 0a  acy note:  When.
d0e0: 20 20 2a 2a 20 53 51 4c 69 74 65 20 77 61 73 20    ** SQLite was 
d0f0: 66 69 72 73 74 20 64 65 76 65 6c 6f 70 65 64 2c  first developed,
d100: 20 57 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65   Windows95 syste
d110: 6d 73 20 77 65 72 65 20 73 74 69 6c 6c 20 76 65  ms were still ve
d120: 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20 20 2a 2a 20  ry common,.  ** 
d130: 61 6e 64 20 57 69 64 6e 6f 77 73 39 35 20 6c 61  and Widnows95 la
d140: 63 6b 73 20 61 20 73 68 61 72 65 64 2d 6c 6f 63  cks a shared-loc
d150: 6b 20 63 61 70 61 62 69 6c 69 74 79 2e 20 20 53  k capability.  S
d160: 6f 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 2c 20  o on Windows95, 
d170: 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20 72 61  a.  ** single ra
d180: 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 20  ndomly selected 
d190: 62 79 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61  by from the 'sha
d1a0: 72 65 64 20 62 79 74 65 20 72 61 6e 67 65 27 20  red byte range' 
d1b0: 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2a 20  is locked..  ** 
d1c0: 57 69 6e 64 6f 77 73 39 35 20 69 73 20 6e 6f 77  Windows95 is now
d1d0: 20 70 72 65 74 74 79 20 6d 75 63 68 20 65 78 74   pretty much ext
d1e0: 69 6e 63 74 2c 20 62 75 74 20 74 68 69 73 20 77  inct, but this w
d1f0: 6f 72 6b 2d 61 72 6f 75 6e 64 20 66 6f 72 20 74  ork-around for t
d200: 68 65 0a 20 20 2a 2a 20 6c 61 63 6b 20 6f 66 20  he.  ** lack of 
d210: 73 68 61 72 65 64 2d 6c 6f 63 6b 73 20 6f 6e 20  shared-locks on 
d220: 57 69 6e 64 6f 77 73 39 35 20 6c 69 76 65 73 20  Windows95 lives 
d230: 6f 6e 2c 20 66 6f 72 20 62 61 63 6b 77 61 72 64  on, for backward
d240: 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 69  s.  ** compatibi
d250: 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a  lity.).  **.  **
d260: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
d270: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
d280: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
d290: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
d2a0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
d2b0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
d2c0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
d2d0: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
d2e0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
d2f0: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
d300: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
d310: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
d320: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
d330: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
d340: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
d350: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
d360: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
d370: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
d380: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
d390: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
d3a0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
d3b0: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
d3c0: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
d3d0: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
d3e0: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
d3f0: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
d400: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
d410: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
d420: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
d430: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
d440: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
d450: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
d460: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
d470: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
d480: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
d490: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
d4a0: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
d4b0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
d4c0: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
d4d0: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
d4e0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
d4f0: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
d500: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
d510: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
d520: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
d530: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
d540: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
d550: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
d560: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
d570: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
d580: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
d590: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
d5a0: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
d5b0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
d5c0: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
d5d0: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
d5e0: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
d5f0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
d600: 62 61 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 6e  base. .  */.  in
d610: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d620: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
d630: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
d640: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
d650: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
d660: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
d670: 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  k;.  int tErrno 
d680: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
d690: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
d6a0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
d6b0: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
d6c0: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
d6d0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
d6e0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
d6f0: 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
d700: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
d710: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a  eLock),.      az
d720: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
d730: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d740: 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  k), pFile->pInod
d750: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
d760: 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
d770: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
d780: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
d790: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
d7a0: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
d7b0: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
d7c0: 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
d7d0: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
d7e0: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
d7f0: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
d800: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
d810: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
d820: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
d830: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d840: 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
d850: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
d860: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
d870: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
d880: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
d890: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
d8a0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
d8b0: 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
d8c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d8d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
d8e0: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
d8f0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
d900: 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20  rect..  **  (1) 
d910: 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
d920: 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
d930: 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
d940: 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
d950: 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
d960: 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
d970: 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
d980: 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
d990: 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
d9a0: 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
d9b0: 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
d9c0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
d9d0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
d9e0: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
d9f0: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
da00: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
da10: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
da20: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
da30: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
da40: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
da50: 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
da60: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
da70: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
da80: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
da90: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
daa0: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
dab0: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
dac0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
dad0: 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
dae0: 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
daf0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
db00: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  e;..  /* If some
db10: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
db20: 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
db30: 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
db40: 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
db50: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
db60: 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
db70: 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
db80: 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
db90: 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  f( (pFile->eFile
dba0: 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46  Lock!=pInode->eF
dbb0: 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20  ileLock && .    
dbc0: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
dbd0: 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
dbe0: 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  G_LOCK || eFileL
dbf0: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
dc00: 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
dc10: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
dc20: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
dc30: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53    }..  /* If a S
dc40: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
dc50: 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
dc60: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
dc70: 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
dc80: 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
dc90: 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
dca0: 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
dcb0: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
dcc0: 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
dcd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
dce0: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
dcf0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
dd00: 20 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f   && .      (pIno
dd10: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
dd20: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
dd30: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
dd40: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
dd50: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
dd60: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
dd70: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
dd80: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
dd90: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
dda0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
ddb0: 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
ddc0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ddd0: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
dde0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
ddf0: 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
de00: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
de10: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
de20: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e    }...  /* A PEN
de30: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
de40: 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
de50: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
de60: 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
de70: 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
de80: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
de90: 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
dea0: 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
deb0: 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
dec0: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
ded0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
dee0: 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65  .  lock.l_whence
def0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69   = SEEK_SET;.  i
df00: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
df10: 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
df20: 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   || (eFileLock==
df30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
df40: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
df50: 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  ck<PENDING_LOCK)
df60: 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  .  ){.    lock.l
df70: 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f  _type = (eFileLo
df80: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f  ck==SHARED_LOCK?
df90: 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29  F_RDLCK:F_WRLCK)
dfa0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
dfb0: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
dfc0: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
dfd0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
dfe0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
dff0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
e000: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e010: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
e020: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
e030: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
e040: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
e050: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
e060: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
e070: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
e080: 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
e090: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
e0a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
e0b0: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
e0c0: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
e0d0: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
e0e0: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
e0f0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
e100: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
e110: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
e120: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
e130: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
e140: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
e150: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
e160: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
e170: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
e180: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
e190: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
e1a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
e1b0: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
e1c0: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
e1d0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e1e0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
e1f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e200: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
e210: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
e220: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
e230: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
e240: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
e250: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
e260: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
e270: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
e280: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  RR_LOCK);.    }.
e290: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
e2a0: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
e2b0: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
e2c0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
e2d0: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
e2e0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
e2f0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
e300: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
e310: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e320: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26  (pFile, &lock) &
e330: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
e340: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
e350: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
e360: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
e370: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
e380: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
e390: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e3a0: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
e3b0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
e3c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
e3d0: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
e3e0: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
e3f0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
e400: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
e410: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
e420: 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
e430: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
e440: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
e450: 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
e460: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
e470: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
e480: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
e490: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
e4a0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
e4b0: 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
e4c0: 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
e4d0: 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
e4e0: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
e4f0: 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
e500: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
e510: 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
e520: 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
e530: 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
e540: 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
e550: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
e560: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
e570: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
e580: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
e590: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
e5a0: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
e5b0: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
e5c0: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
e5d0: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
e5e0: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
e5f0: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
e600: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
e610: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
e620: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
e630: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20  e = F_WRLCK;..  
e640: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
e650: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
e660: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
e670: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
e680: 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  );.    if( eFile
e690: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
e6a0: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  OCK ){.      loc
e6b0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
e6c0: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
e6d0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
e6e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e6f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e700: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
e710: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e720: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
e730: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75      }..    if( u
e740: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
e750: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
e760: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
e770: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
e780: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
e790: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
e7a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
e7b0: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
e7c0: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
e7d0: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
e7e0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
e7f0: 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
e800: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69      }.  }.  ..#i
e810: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
e820: 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  G.  /* Set up th
e830: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f  e transaction-co
e840: 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65  unter change che
e850: 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e  cking flags when
e860: 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  .  ** transition
e870: 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45  ing from a SHARE
e880: 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20  D to a RESERVED 
e890: 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67  lock.  The chang
e8a0: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52  e.  ** from SHAR
e8b0: 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d  ED to RESERVED m
e8c0: 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69  arks the beginni
e8d0: 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20  ng of a normal. 
e8e0: 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74   ** write operat
e8f0: 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a  ion (not a hot j
e900: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
e910: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
e920: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
e930: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e940: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20  k<=SHARED_LOCK. 
e950: 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d    && eFileLock==
e960: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20  RESERVED_LOCK.  
e970: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  ){.    pFile->tr
e980: 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b  ansCntrChng = 0;
e990: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
e9a0: 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  date = 0;.    pF
e9b0: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
e9c0: 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  te = 1;.  }.#end
e9d0: 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  if...  if( rc==S
e9e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e9f0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ea00: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
ea10: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
ea20: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
ea30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
ea40: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
ea50: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
ea60: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
ea70: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
ea80: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
ea90: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
eaa0: 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f  OCK;.  }..end_lo
eab0: 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
eac0: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
ead0: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
eae0: 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20  s %s (unix)\n", 
eaf0: 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
eb00: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
eb10: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
eb20: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
eb30: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
eb40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
eb50: 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64 65   Add the file de
eb60: 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62 79  scriptor used by
eb70: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69   file handle pFi
eb80: 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73  le to the corres
eb90: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73  ponding.** pUnus
eba0: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ed list..*/.stat
ebb0: 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69  ic void setPendi
ebc0: 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  ngFd(unixFile *p
ebd0: 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f  File){.  unixIno
ebe0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
ebf0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
ec00: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
ec10: 70 20 3d 20 70 46 69 6c 65 2d 3e 70 50 72 65 61  p = pFile->pPrea
ec20: 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 3b 0a  llocatedUnused;.
ec30: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
ec40: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ode->pUnused;.  
ec50: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
ec60: 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  = p;.  pFile->h 
ec70: 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  = -1;.  pFile->p
ec80: 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
ec90: 65 64 20 3d 20 30 3b 0a 20 20 6e 55 6e 75 73 65  ed = 0;.  nUnuse
eca0: 64 46 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dFd++;.}../*.** 
ecb0: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
ecc0: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
ecd0: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
ece0: 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
ecf0: 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
ed00: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
ed10: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
ed20: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
ed30: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
ed40: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
ed50: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
ed60: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
ed70: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
ed80: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
ed90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
eda0: 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  o-op..** .** If 
edb0: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
edc0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e  is true, then on
edd0: 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20   downgrading an 
ede0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74  EXCLUSIVE_LOCK t
edf0: 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20  o SHARED.** the 
ee00: 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69  byte range is di
ee10: 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72  vided into 2 par
ee20: 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ts and the first
ee30: 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65   part is unlocke
ee40: 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f  d then.** set to
ee50: 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68   a read lock, th
ee60: 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72  en the other par
ee70: 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f  t is simply unlo
ee80: 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b  cked.  This work
ee90: 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62  s .** around a b
eea0: 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f  ug in BSD NFS lo
eeb0: 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f  ckd (also seen o
eec0: 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20  n MacOSX 10.3+) 
eed0: 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a  that fails to .*
eee0: 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69  * remove the wri
eef0: 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67  te lock on a reg
ef00: 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20  ion when a read 
ef10: 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  lock is set..*/.
ef20: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
ef30: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
ef40: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
ef50: 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64  leLock, int hand
ef60: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20  leNFSUnlock){.  
ef70: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
ef80: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
ef90: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
efa0: 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75   *pInode;.  stru
efb0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
efc0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
efd0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
efe0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
eff0: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
f000: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
f010: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
f020: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
f030: 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46  leLock,.      pF
f040: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
f050: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
f060: 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
f070: 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
f080: 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64  ,.      osGetpid
f090: 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  (0)));..  assert
f0a0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
f0b0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
f0c0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
f0d0: 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
f0e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f0f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
f100: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
f110: 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
f120: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
f130: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
f140: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
f150: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
f160: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
f170: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
f180: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
f190: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
f1a0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
f1b0: 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  _DEBUG.    /* Wh
f1c0: 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
f1d0: 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
f1e0: 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
f1f0: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
f200: 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
f210: 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
f220: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
f230: 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
f240: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
f250: 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
f260: 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
f270: 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
f280: 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
f290: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
f2a0: 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
f2b0: 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
f2c0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
f2d0: 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
f2e0: 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
f2f0: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
f300: 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
f310: 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
f320: 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
f330: 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
f340: 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
f350: 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
f360: 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
f370: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
f380: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
f390: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
f3a0: 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ite = 0;.#endif.
f3b0: 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64  .    /* downgrad
f3c0: 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20  ing to a shared 
f3d0: 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f  lock on NFS invo
f3e0: 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68  lves clearing th
f3f0: 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20  e write lock.   
f400: 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62   ** before estab
f410: 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64  lishing the read
f420: 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20  lock - to avoid 
f430: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
f440: 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20   we downgrade.  
f450: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e    ** the lock in
f460: 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68   2 blocks, so th
f470: 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  at part of the r
f480: 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76  ange will be cov
f490: 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a  ered by a .    *
f4a0: 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74  * write lock unt
f4b0: 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63  il the rest is c
f4c0: 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64  overed by a read
f4d0: 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31   lock:.    **  1
f4e0: 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20  :   [WWWWW].    
f4f0: 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d  **  2:   [....W]
f500: 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52  .    **  3:   [R
f510: 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a  RRRW].    **  4:
f520: 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a     [RRRR.].    *
f530: 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  /.    if( eFileL
f540: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
f550: 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   ){.#if !defined
f560: 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21  (__APPLE__) || !
f570: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
f580: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
f590: 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46    (void)handleNF
f5a0: 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  SUnlock;.      a
f5b0: 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53  ssert( handleNFS
f5c0: 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e  Unlock==0 );.#en
f5d0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
f5e0: 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
f5f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
f600: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
f610: 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  if( handleNFSUnl
f620: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ock ){.        i
f630: 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  nt tErrno;      
f640: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
f650: 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74  r code from syst
f660: 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a  em call errors *
f670: 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  /.        off_t 
f680: 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44  divSize = SHARED
f690: 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20  _SIZE - 1;.     
f6a0: 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b     .        lock
f6b0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f6c0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
f6d0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f6e0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
f6f0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f700: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
f710: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
f720: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
f730: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f740: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
f750: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
f760: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
f770: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
f780: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
f790: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
f7a0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
f7b0: 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
f7c0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
f7d0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
f7e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
f7f0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
f800: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
f810: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f820: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
f830: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f840: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
f850: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
f860: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
f870: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f880: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
f890: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
f8a0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
f8b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
f8c0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
f8d0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
f8e0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
f8f0: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
f900: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
f910: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
f920: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
f930: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
f940: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
f950: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
f960: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
f970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f980: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
f990: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
f9a0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f9b0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
f9c0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f9d0: 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76  SHARED_FIRST+div
f9e0: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f  Size;.        lo
f9f0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
fa00: 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a  D_SIZE-divSize;.
fa10: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
fa20: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
fa30: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
fa40: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
fa50: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
fa60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
fa70: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
fa80: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
fa90: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
faa0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
fab0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
fac0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fad0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
fae0: 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
faf0: 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
fb00: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
fb10: 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  YLE */.      {. 
fb20: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
fb30: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
fb40: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
fb50: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
fb60: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
fb70: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
fb80: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
fb90: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
fba0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69  _SIZE;.        i
fbb0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
fbc0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
fbd0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
fbe0: 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c   theory, the cal
fbf0: 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63  l to unixFileLoc
fc00: 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  k() cannot fail 
fc10: 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a  because another.
fc20: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
fc30: 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
fc40: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
fc50: 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73  lock. If it does
fc60: 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  , this .        
fc70: 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74    ** indicates t
fc80: 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
fc90: 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
fca0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69  lowing the locki
fcb0: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
fcc0: 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69  protocol. If thi
fcd0: 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72  s happens, retur
fce0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
fcf0: 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67  DLOCK. Returning
fd00: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
fd10: 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20  LITE_BUSY would 
fd20: 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65  confuse the uppe
fd30: 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63  r layer (in prac
fd40: 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a  tice it causes .
fd50: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
fd60: 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e  assert to fail).
fd70: 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72   */ .          r
fd80: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
fd90: 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _RDLOCK;.       
fda0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
fdb0: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
fdc0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
fdd0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
fde0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
fdf0: 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
fe00: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
fe10: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
fe20: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
fe30: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
fe40: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
fe50: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
fe60: 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
fe70: 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
fe80: 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
fe90: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
fea0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
feb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  =0 ){.      pIno
fec0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
fed0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
fee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
fef0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
ff00: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74  UNLOCK;.      st
ff10: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
ff20: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
ff30: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
ff40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
ff50: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
ff60: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
ff70: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
ff80: 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
ff90: 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
ffa0: 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
ffb0: 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
ffc0: 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
ffd0: 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
ffe0: 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
fff0: 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
10000 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
10010 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
10020 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
10030 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
10040 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
10050 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
10060 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
10070 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
10080 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
10090 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
100a0 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20  = 0L;.      if( 
100b0 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
100c0 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
100d0 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
100e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
100f0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
10100 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
10110 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10120 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  OCK;.        sto
10130 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
10140 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
10150 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
10160 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
10170 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
10180 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
10190 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
101a0 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
101b0 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
101c0 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
101d0 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
101e0 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
101f0 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
10200 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
10210 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
10220 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
10230 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
10240 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
10250 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
10260 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
10270 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
10280 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
10290 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
102a0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
102b0 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
102c0 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
102d0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
102e0 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a   }..end_unlock:.
102f0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
10300 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
10310 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
10320 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
10330 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
10340 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
10350 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
10360 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
10370 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
10380 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
10390 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
103a0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
103b0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
103c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
103d0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
103e0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
103f0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
10400 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
10410 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
10420 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
10430 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
10440 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
10450 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
10460 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
10470 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23  nt eFileLock){.#
10480 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
10490 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65  AP_SIZE>0.  asse
104a0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
104b0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28  HARED_LOCK || ((
104c0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e  unixFile *)id)->
104d0 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
104e0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
104f0 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
10500 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d  eFileLock, 0);.}
10510 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
10520 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
10530 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66  tic int unixMapf
10540 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
10550 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73  d, i64 nByte);.s
10560 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55  tatic void unixU
10570 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  nmapfile(unixFil
10580 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a  e *pFd);.#endif.
10590 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
105a0 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
105b0 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
105c0 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
105d0 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
105e0 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
105f0 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
10600 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
10610 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
10620 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
10630 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
10640 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
10650 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
10660 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
10670 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74  **.** It is *not
10680 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68  * necessary to h
10690 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68  old the mutex wh
106a0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
106b0 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76  is called,.** ev
106c0 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20  en on VxWorks.  
106d0 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20  A mutex will be 
106e0 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f  acquired on VxWo
106f0 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78  rks by the.** vx
10700 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
10710 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  Id() routine..*/
10720 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
10730 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65  eUnixFile(sqlite
10740 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
10750 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
10760 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
10770 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
10780 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69  MAP_SIZE>0.  uni
10790 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  xUnmapfile(pFile
107a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
107b0 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
107c0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
107d0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
107e0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
107f0 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
10800 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b   }.#if OS_VXWORK
10810 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  S.  if( pFile->p
10820 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  Id ){.    if( pF
10830 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
10840 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
10850 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
10860 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a  nk(pFile->pId->z
10870 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
10880 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b      }.    vxwork
10890 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
108a0 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
108b0 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a  pFile->pId = 0;.
108c0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
108d0 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f  f SQLITE_UNLINK_
108e0 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66  AFTER_CLOSE.  if
108f0 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
10900 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
10910 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e  LETE ){.    osUn
10920 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74  link(pFile->zPat
10930 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
10940 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70  free(*(char**)&p
10950 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
10960 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
10970 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
10980 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
10990 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
109a0 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  e->h));.  OpenCo
109b0 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
109c0 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
109d0 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
109e0 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28  used);.  memset(
109f0 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
10a00 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72  (unixFile));.  r
10a10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10a20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10a30 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
10a40 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28  c int unixClose(
10a50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10a60 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
10a70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
10a80 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10a90 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76  ixFile *)id;.  v
10aa0 65 72 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c  erifyDbFile(pFil
10ab0 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  e);.  unixUnlock
10ac0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
10ad0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
10ae0 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c  );..  /* unixFil
10af0 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61  e.pInode is alwa
10b00 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f  ys valid here. O
10b10 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66  therwise, a diff
10b20 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a  erent close.  **
10b30 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e   routine (e.g. n
10b40 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f  olockClose()) wo
10b50 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e  uld be called in
10b60 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  stead..  */.  as
10b70 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e  sert( pFile->pIn
10b80 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20  ode->nLock>0 || 
10b90 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pFile->pInode->b
10ba0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
10bb0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
10bc0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26  File->pInode) &&
10bd0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
10be0 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20  nLock ){.    /* 
10bf0 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
10c00 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
10c10 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
10c20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
10c30 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62  ust.    ** yet b
10c40 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
10c50 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
10c60 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
10c70 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
10c80 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
10c90 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
10ca0 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20   list.  It will 
10cb0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
10cc0 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20   closed .    ** 
10cd0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
10ce0 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
10cf0 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e     */.    setPen
10d00 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
10d10 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64   }.  releaseInod
10d20 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
10d30 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
10d40 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65  le(id);.  unixLe
10d50 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
10d60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
10d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
10d80 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76  of the posix adv
10d90 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65  isory lock imple
10da0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f  *********** No-o
10e80 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p Locking ******
10e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
10eb0 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
10ec0 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
10ed0 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
10ee0 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
10ef0 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
10f00 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
10f10 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
10f20 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
10f30 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
10f40 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
10f50 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
10f60 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
10f70 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
10f80 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
10f90 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
10fa0 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
10fb0 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
10fc0 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
10fd0 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
10fe0 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
10ff0 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
11000 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
11010 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
11020 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
11030 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
11040 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
11050 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
11060 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
11070 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
11080 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
11090 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
110a0 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
110b0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
110c0 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
110d0 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
110e0 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
110f0 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
11100 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
11110 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
11120 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
11130 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
11140 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
11150 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
11160 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
11170 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
11180 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
11190 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  nt nolockCheckRe
111a0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
111b0 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
111c0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
111d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
111e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
111f0 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
11200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11210 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
11220 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  olockLock(sqlite
11230 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
11240 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
11250 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
11260 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
11270 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
11280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
11290 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
112a0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
112b0 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
112c0 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
112d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
112e0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
112f0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
11300 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11310 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   Close the file.
11320 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
11330 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  olockClose(sqlit
11340 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
11350 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
11360 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a  xFile(id);.}../*
11370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11380 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
11390 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
113a0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
113b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
113c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
11410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11470 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
11480 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
11490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
114b0 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
114c0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
114d0 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
114e0 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65   existence of se
114f0 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
11500 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64  iles (really a d
11510 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e  irectory) to con
11520 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
11530 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
11540 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a  is works.** on j
11550 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20  ust about every 
11560 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
11570 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
11580 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
11590 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
115a0 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
115b0 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
115c0 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
115d0 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
115e0 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
115f0 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
11600 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
11610 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
11620 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
11630 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
11640 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
11650 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
11660 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
11670 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
11680 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
11690 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
116a0 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
116b0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
116c0 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
116d0 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
116e0 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
116f0 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
11700 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
11710 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
11720 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
11730 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
11740 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f  ing a subdirecto
11750 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ry in the same d
11760 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74  irectory as.** t
11770 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
11780 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
11790 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e  me but with a ".
117a0 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20  lock" extension 
117b0 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78  added..** The ex
117c0 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63  istence of a loc
117d0 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c  k directory impl
117e0 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ies an EXCLUSIVE
117f0 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65   lock.  All othe
11800 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20  r.** lock types 
11810 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45  (SHARED, RESERVE
11820 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20  D, PENDING) are 
11830 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c  mapped into EXCL
11840 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  USIVE..*/../*.**
11850 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
11860 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
11870 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  ta base filename
11880 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
11890 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20  ate the.** lock 
118a0 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64  directory..*/.#d
118b0 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55  efine DOTLOCK_SU
118c0 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a  FFIX ".lock"../*
118d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
118e0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
118f0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
11900 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
11910 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
11920 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
11930 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
11940 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
11950 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
11960 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
11970 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
11980 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
11990 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
119a0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
119b0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
119c0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
119d0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
119e0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
119f0 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  hecking..**.** I
11a00 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  n dotfile lockin
11a10 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b  g, either a lock
11a20 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f   exists or it do
11a30 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74  es not.  So in t
11a40 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e  his.** variation
11a50 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65   of CheckReserve
11a60 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75  dLock(), *pResOu
11a70 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
11a80 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20   if any lock.** 
11a90 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  is held on the f
11aa0 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ile and false if
11ab0 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
11ac0 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ocked..*/.static
11ad0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63   int dotlockChec
11ae0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
11af0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11b00 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
11b10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11b20 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
11b30 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
11b40 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11b50 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
11b60 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
11b70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
11b80 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
11b90 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
11ba0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11bb0 0a 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73  .  reserved = os
11bc0 41 63 63 65 73 73 28 28 63 6f 6e 73 74 20 63 68  Access((const ch
11bd0 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
11be0 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29 3d 3d 30  ngContext, 0)==0
11bf0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
11c00 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
11c10 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22   %d (dotlock)\n"
11c20 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
11c30 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70  reserved));.  *p
11c40 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
11c50 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
11c60 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
11c70 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
11c80 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
11c90 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
11ca0 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
11cb0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
11cc0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
11cd0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
11ce0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
11cf0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
11d00 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
11d10 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
11d20 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
11d30 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
11d40 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
11d50 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
11d60 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
11d70 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
11d80 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
11d90 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
11da0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
11db0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
11dc0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
11dd0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
11de0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
11df0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
11e00 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
11e10 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
11e20 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
11e30 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
11e40 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11e50 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
11e60 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
11e70 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
11e80 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
11e90 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
11ea0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
11eb0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
11ec0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11ed0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
11ee0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
11ef0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
11f00 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
11f10 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
11f20 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
11f30 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
11f40 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
11f50 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
11f60 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
11f70 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
11f80 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64  el..**.** With d
11f90 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
11fa0 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73  we really only s
11fb0 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29  upport state (4)
11fc0 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20  : EXCLUSIVE..** 
11fd0 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65  But we track the
11fe0 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c   other locking l
11ff0 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79  evels internally
12000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12010 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  dotlockLock(sqli
12020 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12030 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
12040 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12050 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12060 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
12070 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
12080 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
12090 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ext;.  int rc = 
120a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f  SQLITE_OK;...  /
120b0 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79  * If we have any
120c0 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
120d0 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64  lock file alread
120e0 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77  y exists.  All w
120f0 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
12100 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20  o is adjust our 
12110 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
12120 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65  of the lock leve
12130 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  l..  */.  if( pF
12140 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
12150 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20   NO_LOCK ){.    
12160 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12170 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12180 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61    /* Always upda
12190 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  te the timestamp
121a0 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65   on the old file
121b0 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f   */.#ifdef HAVE_
121c0 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65 28  UTIME.    utime(
121d0 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
121e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69 6d  ;.#else.    utim
121f0 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  es(zLockFile, NU
12200 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LL);.#endif.    
12210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12220 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
12230 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
12240 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f  lock */.  rc = o
12250 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65  sMkdir(zLockFile
12260 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20 72  , 0777);.  if( r
12270 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61  c<0 ){.    /* fa
12280 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65  iled to open/cre
12290 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69 72  ate the lock dir
122a0 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e  ectory */.    in
122b0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
122c0 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54  ;.    if( EEXIST
122d0 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   == tErrno ){.  
122e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
122f0 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  BUSY;.    } else
12300 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
12310 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
12320 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
12330 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
12340 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
12350 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
12360 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
12370 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
12380 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
12390 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
123a0 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f   rc;.  } .  .  /
123b0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
123c0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
123d0 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
123e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
123f0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
12400 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
12410 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
12420 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
12430 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
12440 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
12450 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
12460 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
12470 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
12480 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
12490 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
124a0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
124b0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
124c0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
124d0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
124e0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
124f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
12500 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
12510 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12520 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
12530 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
12540 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
12550 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
12560 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12570 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
12580 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
12590 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
125a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
125b0 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
125c0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
125d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
125e0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
125f0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
12600 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
12610 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
12620 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
12630 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
12640 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
12650 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12660 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  k, osGetpid(0)))
12670 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
12680 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
12690 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
126a0 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
126b0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
126c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
126d0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
126e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
126f0 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67  }..  /* To downg
12700 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20  rade to shared, 
12710 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75  simply update ou
12720 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f  r internal notio
12730 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
12740 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65  ck state.  No ne
12750 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20  ed to mess with 
12760 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
12770 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
12780 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
12790 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
127a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
127b0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  ARED_LOCK;.    r
127c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
127d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20  .  }.  .  /* To 
127e0 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65  fully unlock the
127f0 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74   database, delet
12800 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  e the lock file 
12810 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  */.  assert( eFi
12820 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
12830 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69  );.  rc = osRmdi
12840 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20  r(zLockFile);.  
12850 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
12860 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12870 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74 45 72 72  no;.    if( tErr
12880 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no==ENOENT ){.  
12890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
128a0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
128b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
128c0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
128d0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
128e0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
128f0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  o);.    }.    re
12900 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
12910 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12920 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
12930 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12940 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
12950 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72   file.  Make sur
12960 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
12970 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66  een released bef
12980 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a  ore closing..*/.
12990 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
129a0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
129b0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e  file *id) {.  un
129c0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
129d0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
129e0 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
129f0 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  ;.  dotlockUnloc
12a00 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
12a10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12a20 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
12a30 74 65 78 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  text);.  return 
12a40 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
12a50 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}./**********
12a60 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
12a70 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  the dot-file loc
12a80 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
12a90 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
12aa0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
12ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12af0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
12b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b40 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
12b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b60 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63   Begin flock Loc
12b70 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
12b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b90 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20  *****.**.** Use 
12ba0 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74  the flock() syst
12bb0 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69  em call to do fi
12bc0 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  le locking..**.*
12bd0 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  * flock() lockin
12be0 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69  g is like dot-fi
12bf0 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  le locking in th
12c00 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a  at the various.*
12c10 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63  * fine-grain loc
12c20 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70  king levels supp
12c30 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20  orted by SQLite 
12c40 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e  are collapsed in
12c50 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65  to.** a single e
12c60 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
12c70 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12c80 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
12c90 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47  , and.** PENDING
12ca0 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73   locks are the s
12cb0 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20  ame thing as an 
12cc0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
12cd0 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c   SQLite.** still
12ce0 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20   works when you 
12cf0 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e  do this, but con
12d00 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75  currency is redu
12d10 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c  ced since.** onl
12d20 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
12d30 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ss can be readin
12d40 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  g the database a
12d50 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  t a time..**.** 
12d60 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f  Omit this sectio
12d70 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  n if SQLITE_ENAB
12d80 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
12d90 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a   is turned off.*
12da0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
12db0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
12dc0 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  E../*.** Retry f
12dd0 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61  lock() calls tha
12de0 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54  t fail with EINT
12df0 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54  R.*/.#ifdef EINT
12e00 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  R.static int rob
12e10 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64  ust_flock(int fd
12e20 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74  , int op){.  int
12e30 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
12e40 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77  flock(fd,op); }w
12e50 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
12e60 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
12e70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
12e80 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75  se.# define robu
12e90 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c  st_flock(a,b) fl
12ea0 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a  ock(a,b).#endif.
12eb0 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69       ../*.** Thi
12ec0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
12ed0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
12ee0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
12ef0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
12f00 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
12f10 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
12f20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
12f30 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
12f40 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
12f50 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
12f60 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
12f70 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
12f80 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
12f90 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
12fa0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
12fb0 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
12fc0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
12fd0 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
12fe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12ff0 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
13000 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
13010 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
13020 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
13030 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13040 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
13050 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
13060 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13070 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  )id;.  .  Simula
13080 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
13090 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
130a0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
130b0 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
130c0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20  ( pFile );.  .  
130d0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
130e0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
130f0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
13100 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
13110 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13120 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
13130 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
13140 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
13150 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
13160 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
13170 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
13180 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
13190 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74  {.    /* attempt
131a0 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
131b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
131c0 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  = robust_flock(p
131d0 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
131e0 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20   | LOCK_NB);.   
131f0 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20   if( !lrc ){.   
13200 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f     /* got the lo
13210 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f  ck, unlock it */
13220 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62  .      lrc = rob
13230 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
13240 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
13250 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
13260 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
13270 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
13280 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
13290 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
132a0 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
132b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
132c0 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20  R_UNLOCK; .     
132d0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
132e0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
132f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
13300 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
13310 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
13320 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
13330 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
13340 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
13350 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
13360 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
13370 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
13380 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
13390 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
133a0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
133b0 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
133c0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
133d0 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
133e0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
133f0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
13400 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
13410 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
13420 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
13430 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
13440 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e   %d %d (flock)\n
13450 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
13460 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69   reserved));..#i
13470 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
13480 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13490 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
134a0 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49 54 45   0xff) == SQLITE
134b0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
134c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
134d0 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
134e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
134f0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13500 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
13510 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
13520 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
13530 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
13540 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
13550 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
13560 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
13570 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
13580 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
13590 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
135a0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
135b0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
135c0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
135d0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
135e0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
135f0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
13600 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
13610 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
13620 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
13630 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
13640 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
13650 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
13660 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
13670 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
13680 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
13690 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
136a0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
136b0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
136c0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
136d0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
136e0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
136f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
13700 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
13710 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
13720 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
13730 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
13740 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
13750 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
13760 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
13770 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
13780 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
13790 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
137a0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
137b0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
137c0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
137d0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
137e0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
137f0 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
13800 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
13810 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
13820 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
13830 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
13840 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
13850 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
13860 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
13870 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
13880 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
13890 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
138a0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
138b0 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
138c0 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
138d0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
138e0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
138f0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
13900 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
13910 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
13920 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
13930 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
13940 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
13950 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
13960 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13970 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
13980 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13990 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
139a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
139b0 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
139c0 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
139d0 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
139e0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
139f0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
13a00 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
13a10 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
13a20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
13a30 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
13a40 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
13a50 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
13a60 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13a70 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
13a80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13a90 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
13aa0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13ab0 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
13ac0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
13ad0 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
13ae0 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
13af0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
13b00 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
13b10 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
13b20 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
13b30 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
13b40 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
13b50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
13b60 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
13b70 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
13b80 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
13b90 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
13ba0 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rno);.    }.  } 
13bb0 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
13bc0 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
13bd0 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
13be0 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
13bf0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
13c00 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
13c10 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
13c20 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
13c30 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
13c40 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
13c50 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
13c60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
13c70 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
13c80 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
13c90 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
13ca0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
13cb0 28 72 63 20 26 20 30 78 66 66 29 20 3d 3d 20 53  (rc & 0xff) == S
13cc0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
13cd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
13ce0 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
13cf0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
13d00 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
13d10 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
13d20 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
13d30 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
13d40 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
13d50 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
13d60 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
13d70 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
13d80 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
13d90 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
13da0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
13db0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
13dc0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
13dd0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
13de0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
13df0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
13e00 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
13e10 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
13e20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
13e30 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
13e40 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13e50 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13e60 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13e70 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13e80 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
13e90 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
13ea0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
13eb0 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
13ec0 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
13ed0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
13ee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
13ef0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f  le->eFileLock, o
13f00 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
13f10 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
13f20 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
13f30 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
13f40 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
13f50 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
13f60 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
13f70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13f80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13f90 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
13fa0 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
13fb0 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
13fc0 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
13fd0 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
13fe0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
13ff0 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
14000 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
14010 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
14020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14030 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
14040 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  ly, unlock. */. 
14050 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63   if( robust_floc
14060 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
14070 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53  _UN) ){.#ifdef S
14080 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
14090 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
140a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
140b0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  _OK;.#endif /* S
140c0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
140d0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
140e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
140f0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
14100 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
14110 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14120 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  = NO_LOCK;.    r
14130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14140 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
14150 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
14160 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
14170 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
14180 65 20 2a 69 64 29 20 7b 0a 20 20 61 73 73 65 72  e *id) {.  asser
14190 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 66 6c  t( id!=0 );.  fl
141a0 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
141b0 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e  _LOCK);.  return
141c0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
141d0 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  d);.}..#endif /*
141e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
141f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
14200 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
14210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14220 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
14230 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
14240 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
14250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
142b0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
142c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14310 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
14320 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
14330 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
14340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14350 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
14360 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
14370 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
14380 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
14390 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
143a0 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
143b0 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
143c0 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
143d0 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
143e0 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
143f0 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
14400 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
14410 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
14420 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14430 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
14440 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
14450 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
14460 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
14470 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
14480 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
14490 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
144a0 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
144b0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
144c0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
144d0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
144e0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
144f0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
14500 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
14510 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
14520 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
14530 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
14540 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
14550 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
14560 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
14570 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
14580 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
14590 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
145a0 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
145b0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
145c0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
145d0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
145e0 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76   semXCheckReserv
145f0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
14600 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
14610 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
14620 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14630 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
14640 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
14650 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14660 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
14670 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
14680 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
14690 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
146a0 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
146b0 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
146c0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
146d0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
146e0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
146f0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
14700 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
14710 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
14720 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
14730 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
14740 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
14750 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
14760 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
14770 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
14780 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
14790 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
147a0 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73  pSem;..    if( s
147b0 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
147c0 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ==-1 ){.      in
147d0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
147e0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41  ;.      if( EAGA
147f0 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  IN != tErrno ){.
14800 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
14810 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
14820 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
14830 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
14840 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a  KRESERVEDLOCK);.
14850 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
14860 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
14870 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65  rrno);.      } e
14880 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
14890 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
148a0 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
148b0 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
148c0 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
148d0 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
148e0 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
148f0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
14900 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
14910 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
14920 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
14930 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
14940 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
14950 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
14960 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
14970 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
14980 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
14990 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
149a0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
149b0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
149c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
149d0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
149e0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
149f0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
14a00 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
14a10 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
14a20 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
14a30 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
14a40 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
14a50 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
14a60 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
14a70 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
14a80 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
14a90 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
14aa0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
14ab0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
14ac0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
14ad0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
14ae0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
14af0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
14b00 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
14b10 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
14b20 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
14b30 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
14b40 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
14b50 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
14b60 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
14b70 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
14b80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
14b90 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
14ba0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
14bb0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
14bc0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
14bd0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
14be0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
14bf0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
14c00 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
14c10 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
14c20 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14c30 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
14c40 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
14c50 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14c60 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
14c70 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
14c80 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
14c90 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
14ca0 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
14cb0 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
14cc0 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
14cd0 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
14ce0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
14cf0 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
14d00 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
14d10 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
14d20 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
14d30 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
14d40 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
14d50 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
14d60 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
14d70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14d80 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
14d90 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
14da0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
14db0 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
14dc0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
14dd0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
14de0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f  tatic int semXLo
14df0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14e00 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
14e10 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
14e20 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14e30 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
14e40 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
14e50 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
14e60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14e70 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20  OK;..  /* if we 
14e80 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
14e90 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
14ea0 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
14eb0 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
14ec0 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
14ed0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
14ee0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14ef0 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
14f00 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
14f10 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
14f20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14f30 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  OK;.    goto sem
14f40 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
14f50 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61   .  /* lock sema
14f60 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61  phore now but ba
14f70 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65  il out when alre
14f80 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20  ady locked. */. 
14f90 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
14fa0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
14fb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
14fc0 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  SY;.    goto sem
14fd0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a  _end_lock;.  }..
14fe0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
14ff0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
15000 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
15010 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
15020 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d  eFileLock;.. sem
15030 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74  _end_lock:.  ret
15040 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15050 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
15060 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
15070 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
15080 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
15090 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
150a0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
150b0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
150c0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
150d0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
150e0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
150f0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
15100 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
15110 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
15120 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
15130 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
15140 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
15150 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28   int semXUnlock(
15160 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15170 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
15180 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
15190 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
151a0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
151b0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
151c0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
151d0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
151e0 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
151f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
15200 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
15210 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
15220 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
15230 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
15240 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15250 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ock, osGetpid(0)
15260 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
15270 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
15280 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
15290 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
152a0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
152b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
152c0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
152d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
152e0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
152f0 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
15300 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
15310 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
15320 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
15330 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15340 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
15350 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
15360 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
15370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15380 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
15390 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
153a0 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
153b0 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
153c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
153d0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
153e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
153f0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
15400 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
15410 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
15420 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
15430 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
15440 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
15450 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
15460 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
15470 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
15480 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
15490 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
154a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
154b0 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
154c0 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
154d0 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28 73 71  int semXClose(sq
154e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
154f0 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
15500 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15510 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15520 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63  d;.    semXUnloc
15530 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
15540 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
15550 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  e );.    unixEnt
15560 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
15570 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
15580 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78  pFile);.    unix
15590 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
155a0 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
155b0 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
155c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
155d0 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
155e0 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
155f0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
15600 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
15610 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
15620 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
15630 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
15640 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
15650 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
15660 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
15670 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
15680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156c0 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
156d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15710 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
15720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15730 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
15740 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
15750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15760 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
15770 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
15780 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
15790 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
157a0 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
157b0 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
157c0 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
157d0 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
157e0 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
157f0 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
15800 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
15810 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
15820 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
15830 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
15840 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
15850 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
15860 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
15870 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
15880 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
15890 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
158a0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
158b0 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
158c0 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
158d0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
158e0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
158f0 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
15900 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
15910 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
15920 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
15930 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
15940 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
15950 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
15960 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
15970 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
15980 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
15990 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
159a0 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
159b0 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
159c0 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
159d0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
159e0 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
159f0 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
15a00 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
15a10 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
15a20 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
15a30 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
15a40 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
15a50 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
15a60 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
15a70 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
15a80 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
15a90 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
15aa0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
15ab0 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
15ac0 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
15ad0 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
15ae0 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
15af0 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b10 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
15b20 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
15b30 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
15b40 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
15b50 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
15b60 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
15b70 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
15b80 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
15b90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
15ba0 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
15bb0 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
15bc0 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
15bd0 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
15be0 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
15bf0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
15c00 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
15c10 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
15c20 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
15c30 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
15c40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
15c50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
15c60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
15c70 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
15c80 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
15c90 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
15ca0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
15cb0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
15cc0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
15cd0 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
15ce0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
15cf0 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
15d00 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
15d10 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
15d20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
15d30 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
15d40 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
15d50 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
15d60 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
15d70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
15d80 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
15d90 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
15da0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
15db0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
15dc0 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
15dd0 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
15de0 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
15df0 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
15e00 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
15e10 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
15e20 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
15e30 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
15e40 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
15e50 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
15e60 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
15e70 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
15e80 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
15e90 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
15ea0 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
15eb0 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
15ec0 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
15ed0 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
15ee0 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
15ef0 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
15f00 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
15f10 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
15f20 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
15f30 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
15f40 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
15f50 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
15f60 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
15f70 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
15f80 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
15f90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
15fa0 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
15fb0 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
15fc0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
15fd0 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
15fe0 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
15ff0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
16000 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
16010 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
16020 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
16050 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
16060 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
16070 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
16080 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
16090 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
160a0 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
160b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
160c0 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
160d0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
160e0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
160f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16100 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
16110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16120 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
16130 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
16140 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
16150 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
16160 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
16170 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
16180 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
16190 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
161a0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
161b0 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
161c0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
161d0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
161e0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
161f0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
16200 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
16210 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
16220 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
16230 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
16240 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
16250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
16260 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
16270 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
16280 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
16290 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
162a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
162b0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
162c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
162d0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
162e0 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
162f0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20  text *context;. 
16300 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
16310 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
16320 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
16330 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
16340 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
16350 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d  e );.  context =
16360 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
16370 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
16380 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
16390 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
163a0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
163b0 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
163c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
163d0 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
163e0 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
163f0 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
16400 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
16410 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
16420 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
16430 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
16440 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
16450 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
16460 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
16470 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
16480 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
16490 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
164a0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
164b0 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
164c0 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
164d0 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
164e0 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
164f0 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
16500 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
16510 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
16520 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16530 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16540 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
16550 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
16560 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
16570 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
16580 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
16590 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
165a0 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
165b0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
165c0 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
165d0 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
165e0 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
165f0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16600 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
16610 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
16620 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
16630 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
16640 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
16650 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
16660 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
16670 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
16680 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
16690 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
166a0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
166b0 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
166c0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
166d0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
166e0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
166f0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
16700 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
16710 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
16720 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
16730 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
16740 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16750 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
16760 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
16770 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
16780 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
16790 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
167a0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
167b0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
167c0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
167d0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
167e0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
167f0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
16800 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
16810 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
16820 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
16830 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
16840 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
16850 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
16860 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
16870 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
16880 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
16890 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
168a0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
168b0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
168c0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
168d0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
168e0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
168f0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
16900 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
16910 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
16920 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
16930 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
16940 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
16950 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
16960 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
16970 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
16980 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
16990 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
169a0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
169b0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
169c0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
169d0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
169e0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
169f0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
16a00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
16a10 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
16a20 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
16a30 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
16a40 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
16a50 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
16a60 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
16a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
16a80 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
16a90 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
16aa0 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
16ab0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
16ac0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
16ad0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
16ae0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
16af0 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
16b00 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
16b10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
16b20 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
16b30 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
16b40 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
16b50 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
16b60 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
16b70 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
16b80 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
16b90 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
16ba0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
16bb0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
16bc0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
16bd0 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
16be0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
16bf0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
16c00 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
16c10 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
16c20 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65 74 70  nShared , osGetp
16c30 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  id(0)));..  /* I
16c40 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
16c50 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
16c60 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
16c70 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
16c80 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
16c90 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
16ca0 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
16cb0 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
16cc0 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
16cd0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
16ce0 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
16cf0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
16d00 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16d10 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
16d20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
16d30 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
16d40 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
16d50 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16d60 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16d70 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
16d80 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
16d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
16da0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
16db0 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
16dc0 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
16dd0 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
16de0 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
16df0 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
16e00 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
16e10 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
16e20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
16e30 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
16e40 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
16e50 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
16e60 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
16e70 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
16e80 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
16e90 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
16ea0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
16eb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
16ec0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
16ed0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16ee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
16ef0 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
16f00 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16f10 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
16f20 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
16f30 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
16f40 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16f50 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
16f60 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
16f70 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
16f80 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
16f90 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
16fa0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
16fb0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
16fc0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
16fd0 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
16fe0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
16ff0 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
17000 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
17010 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
17020 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
17030 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
17040 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
17050 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
17060 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
17070 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
17080 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70  ck && .       (p
17090 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
170a0 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
170b0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
170c0 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29  ED_LOCK)).     )
170d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
170e0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
170f0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
17100 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20   }.  .  /* If a 
17110 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
17120 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
17130 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
17140 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
17150 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
17160 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
17170 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
17180 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
17190 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
171a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
171b0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
171c0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
171d0 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f  K && .     (pIno
171e0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
171f0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
17200 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
17210 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
17220 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
17230 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17240 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
17250 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
17260 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
17270 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17280 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
17290 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
172a0 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
172b0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
172c0 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
172d0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
172e0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
172f0 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f  ck;.  }.    .  /
17300 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
17310 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
17320 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
17330 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
17340 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
17350 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
17360 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
17370 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
17380 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
17390 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
173a0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
173b0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
173c0 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
173d0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
173e0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
173f0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
17400 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
17410 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
17420 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
17430 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17440 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
17450 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
17460 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
17470 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
17480 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
17490 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
174a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
174b0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
174c0 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
174d0 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
174e0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
174f0 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
17500 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
17510 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
17520 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
17530 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
17540 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
17550 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  nt lrc1, lrc2, l
17560 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  rc1Errno = 0;.  
17570 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
17580 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
17590 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
175a0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
175b0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
175c0 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
175d0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
175e0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
175f0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
17600 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
17610 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
17620 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
17630 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
17640 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
17650 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
17660 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
17670 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
17680 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
17690 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
176a0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
176b0 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
176c0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
176d0 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
176e0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
176f0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17700 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
17710 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
17720 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
17730 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
17740 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
17750 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
17760 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
17770 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
17780 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
17790 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
177a0 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
177b0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
177c0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
177d0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
177e0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
177f0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
17800 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
17810 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
17820 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45  rno(pFile, lrc1E
17830 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  rrno);.      rc 
17840 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f  = lrc1;.      go
17850 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
17860 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
17870 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
17880 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  c2) ){.      rc 
17890 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f  = lrc2;.      go
178a0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
178b0 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
178c0 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f  lrc1 != SQLITE_O
178d0 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  K ) {.      rc =
178e0 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73   lrc1;.    } els
178f0 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e {.      pFile-
17900 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
17910 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
17920 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
17930 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
17940 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
17950 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
17960 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
17970 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
17980 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
17990 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
179a0 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
179b0 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
179c0 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
179d0 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61   this.     ** sa
179e0 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
179f0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
17a00 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
17a10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17a20 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
17a30 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
17a40 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
17a50 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
17a60 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
17a70 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
17a80 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
17a90 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
17aa0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
17ab0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
17ac0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61     */.    int fa
17ad0 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73  iled = 0;.    as
17ae0 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
17af0 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
17b00 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e   if (eFileLock >
17b10 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  = RESERVED_LOCK 
17b20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
17b30 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c  ock < RESERVED_L
17b40 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  OCK) {.        /
17b50 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
17b60 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  RVED lock */.   
17b70 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66       failed = af
17b80 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17b90 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17ba0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
17bb0 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,1);.      if( 
17bc0 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  !failed ){.     
17bd0 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
17be0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
17bf0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
17c00 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65  !failed && eFile
17c10 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56  Lock == EXCLUSIV
17c20 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
17c30 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
17c40 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
17c50 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
17c60 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
17c70 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
17c80 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
17c90 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
17ca0 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
17cb0 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
17cc0 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
17cd0 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
17ce0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20  nlock.      */. 
17cf0 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65       if( !(faile
17d00 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
17d10 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17d20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
17d30 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17d50 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
17d60 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20  e, 1, 0)) ){.   
17d70 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32       int failed2
17d80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17d90 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74        /* now att
17da0 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  emmpt to get the
17db0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
17dc0 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20  range */.       
17dd0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
17de0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17df0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
17e00 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
17e30 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20  D_SIZE, 1);.    
17e40 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26      if( failed &
17e50 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70  & (failed2 = afp
17e60 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17e70 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17e90 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
17ea0 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73  IRST + pInode->s
17eb0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
17ec0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
17ed0 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c  * Can't reestabl
17ee0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
17ef0 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e  ock.  Sqlite can
17f00 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73  't deal, this is
17f10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
17f20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72  critical I/O err
17f30 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  or.          */.
17f40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28            rc = (
17f50 28 66 61 69 6c 65 64 20 26 20 30 78 66 66 29 20  (failed & 0xff) 
17f60 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
17f70 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17f90 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
17fa0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
17fb0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
17fc0 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
17fd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
17fe0 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
17ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
18000 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
18010 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
18020 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
18030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18040 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
18050 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
18060 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
18070 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
18080 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
18090 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
180a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
180b0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
180c0 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
180d0 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
180e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
180f0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
18100 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
18110 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
18120 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
18130 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
18140 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
18150 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
18160 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
18170 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
18180 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
18190 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
181a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
181b0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
181c0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
181d0 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
181e0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
181f0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
18200 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
18210 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
18220 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
18230 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
18240 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
18250 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
18260 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
18270 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
18280 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
18290 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
182a0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
182b0 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
182c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
182d0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
182e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
182f0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
18300 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
18310 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
18320 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
18330 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
18340 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
18350 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
18360 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
18370 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
18380 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
18390 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
183a0 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
183b0 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
183c0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
183d0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
183e0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
183f0 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
18400 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
18410 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
18420 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
18430 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
18440 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
18450 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
18460 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
18470 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  d,.           os
18480 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20  Getpid(0)));..  
18490 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
184a0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
184b0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
184c0 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
184d0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
184e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
184f0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
18500 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
18510 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
18520 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
18530 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
18540 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
18550 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
18560 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
18570 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
18580 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
18590 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
185a0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
185b0 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
185c0 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
185d0 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
185e0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
185f0 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  ;.    .#ifdef SQ
18600 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
18610 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
18620 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
18630 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
18640 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
18650 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
18660 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
18670 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
18680 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
18690 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
186a0 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
186b0 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
186c0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
186d0 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
186e0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
186f0 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
18700 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
18710 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
18720 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
18730 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
18740 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
18750 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
18760 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
18770 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
18780 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
18790 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
187a0 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
187b0 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
187c0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
187d0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
187e0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
187f0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
18800 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
18810 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
18820 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
18830 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
18840 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
18850 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
18860 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
18870 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
18880 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
18890 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
188a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
188b0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
188c0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
188d0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
188e0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
188f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18900 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
18910 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
18920 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
18930 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
18940 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
18950 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
18960 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
18970 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
18980 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
18990 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
189a0 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
189b0 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
189c0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
189d0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
189e0 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
189f0 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
18a00 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
18a10 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
18a20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
18a30 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
18a40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
18a50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
18a60 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
18a70 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
18a80 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
18a90 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
18aa0 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
18ab0 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
18ac0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18ad0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18ae0 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
18af0 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
18b00 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
18b10 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
18b20 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
18b30 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
18b40 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
18b50 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
18b60 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
18b70 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
18b80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18b90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18ba0 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
18bb0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
18bc0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18bd0 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
18be0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
18bf0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
18c00 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
18c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
18c20 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
18c30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
18c40 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
18c50 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
18c60 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
18c70 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
18c80 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
18c90 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
18ca0 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
18cb0 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
18cc0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
18cd0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
18ce0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
18cf0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
18d00 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
18d10 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
18d20 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
18d30 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
18d40 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
18d50 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
18d60 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18d70 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
18d80 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
18d90 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
18da0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18db0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
18dc0 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
18dd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
18de0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
18df0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18e00 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
18e10 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
18e20 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
18e30 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
18e40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
18e50 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
18e60 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
18e70 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
18e80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
18e90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18ea0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
18eb0 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
18ec0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
18ed0 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
18ee0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
18ef0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
18f00 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
18f10 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
18f20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
18f30 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
18f40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18f50 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
18f60 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
18f70 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
18f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
18f90 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
18fa0 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
18fb0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
18fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
18fd0 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
18fe0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
18ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19000 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
19010 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
19020 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  id;.  assert( id
19030 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f  !=0 );.  afpUnlo
19040 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
19050 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
19060 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x();.  if( pFile
19070 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c  ->pInode && pFil
19080 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
19090 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
190a0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
190b0 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
190c0 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
190d0 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
190e0 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
190f0 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
19100 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
19110 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
19120 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
19130 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
19140 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  de->aPending.  I
19150 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
19160 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
19170 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
19180 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
19190 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
191a0 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
191b0 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
191c0 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
191d0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
191e0 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
191f0 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20  gContext);.  rc 
19200 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
19210 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  id);.  unixLeave
19220 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
19230 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
19240 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
19250 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
19260 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
19270 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
19280 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
19290 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
192a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
192b0 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
192c0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
192d0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
192e0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
192f0 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
19300 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
19310 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
19320 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
19330 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
19340 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
19350 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
19360 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
19370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19380 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
19390 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
193a0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
193b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
193c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
19410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
19460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19470 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
19480 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  NFS Locking ****
19490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23  ************/..#
194b0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
194c0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
194d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
194e0 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65  TYLE./*. ** Lowe
194f0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
19500 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
19510 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
19520 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
19530 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62  eLock. ** must b
19540 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
19550 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
19560 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20  . **. ** If the 
19570 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
19580 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
19590 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
195a0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20  at or below. ** 
195b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
195c0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
195d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
195e0 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  o-op.. */.static
195f0 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73   int nfsUnlock(s
19600 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19610 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
19620 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
19630 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
19640 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64  ock, 1);.}..#end
19650 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
19660 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
19670 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
19680 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
19690 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
196a0 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  is the NFS lock 
196b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
196c0 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
196d0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
196e0 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
196f0 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
19700 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
19710 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
19720 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
19730 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
19740 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
19750 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
19760 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
19770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19780 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
19790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197d0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
197e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19820 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
19830 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e  ***** Non-lockin
19840 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  g sqlite3_file m
19850 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
19860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19870 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
19880 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  ext division con
19890 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61  tains implementa
198a0 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65  tions for all me
198b0 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a  thods of the .**
198c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
198d0 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20  ject other than 
198e0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  the locking meth
198f0 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ods.  The lockin
19900 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72  g.** methods wer
19910 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76  e defined in div
19920 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e  isions above (on
19930 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
19940 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e   per.** division
19950 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64  ).  Those method
19960 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
19970 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
19980 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61   modes.** are ga
19990 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e  ther together in
199a0 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  to this division
199b0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ..*/../*.** Seek
199c0 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70   to the offset p
199d0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
199e0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
199f0 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20  en read cnt .** 
19a00 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
19a10 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
19a20 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
19a30 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ally read..**.**
19a40 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66   NB:  If you def
19a50 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72  ine USE_PREAD or
19a60 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68   USE_PREAD64, th
19a70 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f  en it might also
19a80 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
19a90 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
19aa0 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35  N_SOURCE to be 5
19ab0 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73  00.  This varies
19ac0 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73   from.** one sys
19ad0 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  tem to another. 
19ae0 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f   Since SQLite do
19af0 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53  es not define US
19b00 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e  E_PREAD.** in an
19b10 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c  y form by defaul
19b20 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61  t, we will not a
19b30 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65  ttempt to define
19b40 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a   _XOPEN_SOURCE..
19b50 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23  ** See tickets #
19b60 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a  2741 and #2681..
19b70 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
19b80 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
19b90 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
19ba0 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73  led read the las
19bb0 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
19bc0 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
19bd0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
19be0 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
19bf0 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
19c00 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
19c10 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75  ffset, void *pBu
19c20 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
19c30 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72  nt got;.  int pr
19c40 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64  ior = 0;.#if (!d
19c50 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
19c60 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53  ) && !defined(US
19c70 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36  E_PREAD64)).  i6
19c80 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e  4 newOffset;.#en
19c90 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  dif.  TIMER_STAR
19ca0 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  T;.  assert( cnt
19cb0 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20  ==(cnt&0x1ffff) 
19cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  );.  assert( id-
19cd0 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69  >h>2 );.  do{.#i
19ce0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
19cf0 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  EAD).    got = o
19d00 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  sPread(id->h, pB
19d10 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
19d20 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
19d30 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
19d40 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
19d50 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
19d60 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36    got = osPread6
19d70 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
19d80 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
19d90 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19da0 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
19db0 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  lse.    newOffse
19dc0 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
19dd0 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
19de0 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
19df0 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
19e00 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69  et = -1 );.    i
19e10 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30 20 29  f( newOffset<0 )
19e20 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
19e30 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
19e40 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
19e50 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
19e60 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
19e70 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
19e80 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
19e90 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
19ea0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
19eb0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
19ec0 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
19ed0 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
19ee0 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
19ef0 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
19f00 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
19f10 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20  (unixFile*)id,  
19f20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72  errno);.      br
19f30 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
19f40 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
19f50 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
19f60 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
19f70 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
19f80 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
19f90 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
19fa0 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
19fb0 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
19fc0 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
19fd0 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
19fe0 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
19ff0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1a000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
1a010 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
1a020 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
1a030 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
1a040 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
1a050 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
1a060 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
1a070 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
1a080 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1a090 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
1a0a0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
1a0b0 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
1a0c0 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
1a0d0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1a0e0 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1a0f0 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
1a100 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a110 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
1a120 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1a130 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1a140 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
1a150 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1a160 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1a170 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
1a180 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1a190 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
1a1a0 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1a1b0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1a1c0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1a1d0 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1a1e0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1a1f0 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1a200 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1a210 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1a220 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1a230 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1a240 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1a250 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 50  ssert( pFile->pP
1a260 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
1a270 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1a280 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1a290 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1a2a0 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1a2b0 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1a2c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1a2d0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1a2e0 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1a2f0 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1a300 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20  is read request 
1a310 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
1a320 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
1a330 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
1a340 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
1a350 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
1a360 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
1a370 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1a380 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
1a390 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
1a3a0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
1a3b0 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
1a3c0 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1a3d0 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1a3e0 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72  ], amt);.      r
1a3f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a400 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a410 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46    int nCopy = pF
1a420 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
1a430 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65  offset;.      me
1a440 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
1a450 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
1a460 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
1a470 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
1a480 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
1a490 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
1a4a0 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
1a4b0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
1a4c0 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
1a4d0 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d  .#endif..  got =
1a4e0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
1a4f0 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
1a500 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f  , amt);.  if( go
1a510 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  t==amt ){.    re
1a520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a530 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
1a540 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74  0 ){.    /* last
1a550 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
1a560 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
1a570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a580 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ERR_READ;.  }els
1a590 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  e{.    storeLast
1a5a0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b  Errno(pFile, 0);
1a5b0 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74     /* not a syst
1a5c0 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1a5d0 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
1a5e0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
1a5f0 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
1a600 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
1a610 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
1a620 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
1a630 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1a640 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1a650 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
1a660 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
1a670 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65 73 63  ek the file-desc
1a680 72 69 70 74 6f 72 20 70 61 73 73 65 64 20 61 73  riptor passed as
1a690 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1a6a0 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75  ent to.** absolu
1a6b0 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66 2c 20  te offset iOff, 
1a6c0 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  then attempt to 
1a6d0 77 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  write nBuf bytes
1a6e0 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a   of data from.**
1a6f0 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49 66 20   pBuf to it. If 
1a700 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1a710 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 73   return -1 and s
1a720 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68  et *piErrno. Oth
1a730 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75  erwise, .** retu
1a740 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75  rn the actual nu
1a750 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
1a760 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d 61 79  itten (which may
1a770 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a   be less than.**
1a780 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69   nBuf)..*/.stati
1a790 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1a7a0 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64 2c 20  teFd(.  int fd, 
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1a7d0 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 77 72  descriptor to wr
1a7e0 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
1a7f0 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20 20  iOff,           
1a800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a810 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65  ile offset to be
1a820 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
1a830 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1a840 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
1a850 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1a860 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65   from this buffe
1a870 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  r to the file */
1a880 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 20 20  .  int nBuf,    
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
1a8b0 66 66 65 72 20 70 42 75 66 20 69 6e 20 62 79 74  ffer pBuf in byt
1a8c0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45  es */.  int *piE
1a8d0 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  rrno            
1a8e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1a8f0 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69 66 20  Error number if 
1a900 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a  error occurs */.
1a910 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a930 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1a940 74 75 72 6e 65 64 20 62 79 20 73 79 73 74 65 6d  turned by system
1a950 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   call */..  asse
1a960 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26  rt( nBuf==(nBuf&
1a970 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73  0x1ffff) );.  as
1a980 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a 20 20  sert( fd>2 );.  
1a990 61 73 73 65 72 74 28 20 70 69 45 72 72 6e 6f 21  assert( piErrno!
1a9a0 3d 30 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20  =0 );.  nBuf &= 
1a9b0 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52  0x1ffff;.  TIMER
1a9c0 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66  _START;..#if def
1a9d0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
1a9e0 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29    do{ rc = (int)
1a9f0 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70 42 75  osPwrite(fd, pBu
1aa00 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20  f, nBuf, iOff); 
1aa10 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1aa20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
1aa30 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
1aa40 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b  E_PREAD64).  do{
1aa50 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72   rc = (int)osPwr
1aa60 69 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20  ite64(fd, pBuf, 
1aa70 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69  nBuf, iOff);}whi
1aa80 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1aa90 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65  o==EINTR);.#else
1aaa0 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69  .  do{.    i64 i
1aab0 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c  Seek = lseek(fd,
1aac0 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29   iOff, SEEK_SET)
1aad0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1aae0 45 72 72 6f 72 28 20 69 53 65 65 6b 20 3d 20 2d  Error( iSeek = -
1aaf0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65  1 );.    if( iSe
1ab00 65 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ek<0 ){.      rc
1ab10 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65   = -1;.      bre
1ab20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
1ab30 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70   = osWrite(fd, p
1ab40 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77  Buf, nBuf);.  }w
1ab50 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1ab60 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
1ab70 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e  ndif..  TIMER_EN
1ab80 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  D;.  OSTRACE(("W
1ab90 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20  RITE   %-3d %5d 
1aba0 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66  %7lld %llu\n", f
1abb0 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d  d, rc, iOff, TIM
1abc0 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20  ER_ELAPSED));.. 
1abd0 20 69 66 28 20 72 63 3c 30 20 29 20 2a 70 69 45   if( rc<0 ) *piE
1abe0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1abf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1ac00 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
1ac10 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
1ac20 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
1ac30 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
1ac40 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
1ac50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1ac60 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
1ac70 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
1ac80 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
1ac90 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
1aca0 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
1acb0 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
1acc0 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
1acd0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
1ace0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1acf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1ad00 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
1ad10 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
1ad20 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
1ad30 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
1ad40 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e  .  return seekAn
1ad50 64 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20  dWriteFd(id->h, 
1ad60 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e  offset, pBuf, cn
1ad70 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e  t, &id->lastErrn
1ad80 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  o);.}.../*.** Wr
1ad90 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
1ada0 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
1adb0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1adc0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1add0 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
1ade0 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
1adf0 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
1ae00 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65  ic int unixWrite
1ae10 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1ae20 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76   *id, .  const v
1ae30 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
1ae40 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
1ae50 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29  _int64 offset .)
1ae60 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1ae70 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1ae80 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65  )id;.  int wrote
1ae90 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1aea0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1aeb0 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
1aec0 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
1aed0 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
1aee0 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
1aef0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
1af00 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
1af10 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
1af20 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
1af30 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
1af40 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
1af50 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
1af60 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63  pFile->pPrealloc
1af70 61 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20  atedUnused==0.  
1af80 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
1af90 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
1afa0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1afb0 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
1afc0 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
1afd0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1afe0 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65  DEBUG.  /* If we
1aff0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1b000 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1b010 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1b020 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a   opposed to.  **
1b030 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
1b040 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
1b050 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
1b060 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
1b070 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64   a.  ** normal d
1b080 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68  atabase file) th
1b090 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  en record the fa
1b0a0 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ct that the data
1b0b0 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68  base.  ** has ch
1b0c0 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
1b0d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1b0e0 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  er is modified, 
1b0f0 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a  record that.  **
1b100 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   fact too..  */.
1b110 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1b120 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
1b130 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
1b140 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
1b150 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1b160 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
1b170 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
1b180 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
1b190 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
1b1a0 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
1b1b0 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
1b1c0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1b1d0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1b1e0 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
1b1f0 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
1b200 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
1b210 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1b220 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
1b230 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
1b240 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
1b250 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
1b260 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
1b270 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
1b280 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1b290 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
1b2a0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
1b2b0 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
1b2c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1b2d0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1b2e0 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52  ed(SQLITE_MMAP_R
1b2f0 45 41 44 57 52 49 54 45 29 20 26 26 20 53 51 4c  EADWRITE) && SQL
1b300 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1b310 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1b320 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1b330 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
1b340 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
1b350 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
1b360 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
1b370 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
1b380 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
1b390 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1b3a0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1b3b0 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
1b3c0 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
1b3d0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1b3e0 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1b3f0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1b400 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1b410 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
1b420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b430 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b440 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
1b450 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
1b460 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d   offset;.      m
1b470 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1b480 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1b490 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1b4a0 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1b4b0 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
1b4c0 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
1b4d0 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
1b4e0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1b4f0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1b500 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77 68 69  }.#endif. .  whi
1b510 6c 65 28 20 28 77 72 6f 74 65 20 3d 20 73 65 65  le( (wrote = see
1b520 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1b530 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1b540 6d 74 29 29 3c 61 6d 74 20 26 26 20 77 72 6f 74  mt))<amt && wrot
1b550 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  e>0 ){.    amt -
1b560 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66  = wrote;.    off
1b570 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20  set += wrote;.  
1b580 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
1b590 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
1b5a0 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
1b5b0 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d  Error(( wrote=(-
1b5c0 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20  1), amt=1 ));.  
1b5d0 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
1b5e0 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c  Error(( wrote=0,
1b5f0 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66   amt=1 ));..  if
1b600 28 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20  ( amt>wrote ){. 
1b610 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26     if( wrote<0 &
1b620 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  & pFile->lastErr
1b630 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20  no!=ENOSPC ){.  
1b640 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
1b650 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57   set by seekAndW
1b660 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  rite */.      re
1b670 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b680 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
1b690 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  se{.      storeL
1b6a0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
1b6b0 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73  0); /* not a sys
1b6c0 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
1b6d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b6e0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
1b6f0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1b700 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
1b710 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
1b720 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1b730 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
1b740 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
1b750 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1b760 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
1b770 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
1b780 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e  ncs are occurrin
1b790 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
1b7a0 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
1b7b0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
1b7c0 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
1b7d0 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
1b7e0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
1b7f0 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75  ** We do not tru
1b800 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72  st systems to pr
1b810 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20  ovide a working 
1b820 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f  fdatasync().  So
1b830 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73  me do..** Others
1b840 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73   do no.  To be s
1b850 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  afe, we will sti
1b860 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 69  ck with the (sli
1b870 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a  ghtly slower).**
1b880 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75   fsync(). If you
1b890 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20   know that your 
1b8a0 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70  system does supp
1b8b0 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  ort fdatasync() 
1b8c0 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68  correctly,.** th
1b8d0 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c  en simply compil
1b8e0 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79  e with -Dfdatasy
1b8f0 6e 63 3d 66 64 61 74 61 73 79 6e 63 20 6f 72 20  nc=fdatasync or 
1b900 2d 44 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43  -DHAVE_FDATASYNC
1b910 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
1b920 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21  (fdatasync) && !
1b930 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23  HAVE_FDATASYNC.#
1b940 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e   define fdatasyn
1b950 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a  c fsync.#endif..
1b960 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56  /*.** Define HAV
1b970 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30  E_FULLFSYNC to 0
1b980 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20   or 1 depending 
1b990 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
1b9a0 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46  t.** the F_FULLF
1b9b0 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65  SYNC macro is de
1b9c0 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53  fined.  F_FULLFS
1b9d0 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79  YNC is currently
1b9e0 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  .** only availab
1b9f0 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20  le on Mac OS X. 
1ba00 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20   But that could 
1ba10 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  change..*/.#ifde
1ba20 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20  f F_FULLFSYNC.# 
1ba30 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
1ba40 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20  FSYNC 1.#else.# 
1ba50 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
1ba60 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a  FSYNC 0.#endif..
1ba70 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63  ./*.** The fsync
1ba80 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64  () system call d
1ba90 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20  oes not work as 
1baa0 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61  advertised on ma
1bab0 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65  ny.** unix syste
1bac0 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ms.  The followi
1bad0 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  ng procedure is 
1bae0 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61  an attempt to ma
1baf0 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65  ke.** it work be
1bb00 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tter..**.** The 
1bb10 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d  SQLITE_NO_SYNC m
1bb20 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c  acro disables al
1bb30 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69  l fsync()s.  Thi
1bb40 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66  s is useful.** f
1bb50 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20  or testing when 
1bb60 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74  we want to run t
1bb70 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20  hrough the test 
1bb80 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a  suite quickly..*
1bb90 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67  * You are strong
1bba0 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a  ly advised *not*
1bbb0 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20   to deploy with 
1bbc0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a  SQLITE_NO_SYNC.*
1bbd0 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76  * enabled, howev
1bbe0 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53  er, since with S
1bbf0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e  QLITE_NO_SYNC en
1bc00 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61  abled, an OS cra
1bc10 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  sh.** or power f
1bc20 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65  ailure will like
1bc30 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
1bc40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1bc50 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20  .** SQLite sets 
1bc60 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
1bc70 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66  g if the size of
1bc80 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63   the file is unc
1bc90 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69  hanged..** The i
1bca0 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f  dea behind dataO
1bcb0 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73  nly is that it s
1bcc0 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65  hould only write
1bcd0 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e   the file conten
1bce0 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f  t.** to disk, no
1bcf0 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65  t the inode.  We
1bd00 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e   only set dataOn
1bd10 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ly if the file s
1bd20 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61  ize is .** uncha
1bd30 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66  nged since the f
1bd40 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74  ile size is part
1bd50 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20   of the inode.  
1bd60 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64  However, .** Ted
1bd70 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74   Ts'o tells us t
1bd80 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
1bd90 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20  will also write 
1bda0 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65  the inode if the
1bdb0 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61  .** file size ha
1bdc0 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20  s changed.  The 
1bdd0 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72  only real differ
1bde0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61  ence between fda
1bdf0 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20  tasync().** and 
1be00 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c  fsync(), Ted tel
1be10 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66  ls us, is that f
1be20 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1be30 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a  not flush the.**
1be40 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74   inode if the mt
1be50 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20  ime or owner or 
1be60 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72  other inode attr
1be70 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e  ibutes have chan
1be80 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20  ged..** We only 
1be90 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66  care about the f
1bea0 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68  ile size, not th
1beb0 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74  e other file att
1bec0 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61  ributes, so.** a
1bed0 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20  s far as SQLite 
1bee0 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e  is concerned, an
1bef0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20   fdatasync() is 
1bf00 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e  always adequate.
1bf10 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79  .** So, we alway
1bf20 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28  s use fdatasync(
1bf30 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c  ) if it is avail
1bf40 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73  able, regardless
1bf50 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   of.** the value
1bf60 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79   of the dataOnly
1bf70 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   flag..*/.static
1bf80 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28   int full_fsync(
1bf90 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c  int fd, int full
1bfa0 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e  Sync, int dataOn
1bfb0 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ly){.  int rc;..
1bfc0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1bfd0 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65  ng "ifdef/elif/e
1bfe0 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20  lse/" block has 
1bff0 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75  the same structu
1c000 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f  re as.  ** the o
1c010 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20  ne below. It is 
1c020 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20  replicated here 
1c030 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20  solely to avoid 
1c040 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a  cluttering .  **
1c050 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64   up the real cod
1c060 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45  e with the UNUSE
1c070 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61  D_PARAMETER() ma
1c080 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  cros..  */.#ifde
1c090 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1c0a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1c0b0 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
1c0c0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1c0d0 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1c0e0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1c0f0 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  ly);.#elif HAVE_
1c100 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53  FULLFSYNC.  UNUS
1c110 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1c120 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20  aOnly);.#else.  
1c130 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1c140 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
1c150 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1c160 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66  ataOnly);.#endif
1c170 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
1c180 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
1c190 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e  s that we do a n
1c1a0 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e  ormal fsync() an
1c1b0 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43  d .  ** FULLSYNC
1c1c0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1c1d0 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74  during testing t
1c1e0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
1c1f0 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  is procedure.  *
1c200 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69  * gets called wi
1c210 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  th the correct a
1c220 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23  rguments..  */.#
1c230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1c240 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  T.  if( fullSync
1c250 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73   ) sqlite3_fulls
1c260 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73  ync_count++;.  s
1c270 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1c280 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
1c290 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
1c2a0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
1c2b0 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
1c2c0 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
1c2d0 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 42 75  .  ** no-op.  Bu
1c2e0 74 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 63  t go ahead and c
1c2f0 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 76  all fstat() to v
1c300 61 6c 69 64 61 74 65 20 74 68 65 20 66 69 6c 65  alidate the file
1c310 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  .  ** descriptor
1c320 20 61 73 20 77 65 20 6e 65 65 64 20 61 20 6d 65   as we need a me
1c330 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20  thod to provoke 
1c340 61 20 66 61 69 6c 75 72 65 20 64 75 72 69 6e 67  a failure during
1c350 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74 65 20 74  .  ** coverate t
1c360 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a 23 69 66  esting..  */.#if
1c370 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1c380 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63  NC.  {.    struc
1c390 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
1c3a0 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
1c3b0 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69   &buf);.  }.#eli
1c3c0 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1c3d0 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
1c3e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ){.    rc = osFc
1c3f0 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53  ntl(fd, F_FULLFS
1c400 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  YNC, 0);.  }else
1c410 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
1c420 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
1c430 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
1c440 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
1c450 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
1c460 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
1c470 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
1c480 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
1c490 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
1c4a0 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
1c4b0 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
1c4c0 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
1c4d0 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
1c4e0 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
1c4f0 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
1c500 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
1c510 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
1c520 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
1c530 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
1c540 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
1c550 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
1c560 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
1c570 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
1c580 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
1c590 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
1c5a0 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
1c5b0 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
1c5c0 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
1c5d0 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
1c5e0 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
1c5f0 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
1c600 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1c610 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
1c620 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
1c630 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
1c640 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
1c650 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
1c660 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
1c670 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
1c680 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
1c690 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
1c6a0 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
1c6b0 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
1c6c0 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
1c6d0 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
1c6e0 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
1c6f0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
1c700 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
1c710 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
1c720 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
1c730 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
1c740 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
1c750 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
1c760 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
1c770 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
1c780 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
1c790 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
1c7a0 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
1c7b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c7c0 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
1c7d0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
1c7e0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1c7f0 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
1c800 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
1c810 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
1c820 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
1c830 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1c840 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
1c850 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1c860 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1c870 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
1c880 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
1c890 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
1c8a0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1c8b0 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
1c8c0 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
1c8d0 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ue..**.** The di
1c8e0 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
1c8f0 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20  criptor is used 
1c900 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69  for only one thi
1c910 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63  ng - to.** fsync
1c920 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74  () a directory t
1c930 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65  o make sure file
1c940 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65   creation and de
1c950 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a  letion events.**
1c960 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
1c970 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e  disk.  Such fsyn
1c980 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  cs are not neede
1c990 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f  d on newer.** jo
1c9a0 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73  urnaling filesys
1c9b0 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65  tems, but are re
1c9c0 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20  quired on older 
1c9d0 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  filesystems..**.
1c9e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c9f0 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1ca00 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74  n using the xSet
1ca10 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63  SysCall interfac
1ca20 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74  e..** The abilit
1ca30 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68  y to override th
1ca40 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61  is routine was a
1ca50 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20  dded in support 
1ca60 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69  of the.** chromi
1ca70 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65  um sandbox.  Ope
1ca80 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ning a directory
1ca90 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72   is a security r
1caa0 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74  isk (we are.** t
1cab0 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69  old) so making i
1cac0 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61  t overrideable a
1cad0 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69  llows the chromi
1cae0 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a  um sandbox to.**
1caf0 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f   replace this ro
1cb00 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72  utine with a har
1cb10 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f  mless no-op.  To
1cb20 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69   make this routi
1cb30 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72  ne.** a no-op, r
1cb40 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
1cb50 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72   stub that retur
1cb60 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  ns SQLITE_OK but
1cb70 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20   leaves.** *pFd 
1cb80 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76  set to a negativ
1cb90 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
1cba0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1cbb0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
1cbc0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1cbd0 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
1cbe0 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
1cbf0 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
1cc00 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
1cc10 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
1cc20 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1cc30 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1cc40 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
1cc50 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
1cc60 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
1cc70 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
1cc80 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
1cc90 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1cca0 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
1ccb0 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
1ccc0 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
1ccd0 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1cce0 20 69 69 3e 30 20 26 26 20 7a 44 69 72 6e 61 6d   ii>0 && zDirnam
1ccf0 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
1cd00 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
1cd10 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
1cd20 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73  ] = '\0';.  }els
1cd30 65 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 6e  e{.    if( zDirn
1cd40 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20 7a 44  ame[0]!='/' ) zD
1cd50 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b  irname[0] = '.';
1cd60 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 31 5d  .    zDirname[1]
1cd70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64 20 3d   = 0;.  }.  fd =
1cd80 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
1cd90 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1cda0 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1cdb0 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
1cdc0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1cdd0 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1cde0 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1cdf0 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
1ce00 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65    if( fd>=0 ) re
1ce10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ce20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1ce30 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1ce40 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
1ce50 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69  nDirectory", zDi
1ce60 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rname);.}../*.**
1ce70 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
1ce80 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
1ce90 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
1cea0 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
1ceb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
1cec0 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
1ced0 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
1cee0 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
1cef0 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
1cf00 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
1cf10 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
1cf20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
1cf30 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
1cf40 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
1cf50 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
1cf60 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
1cf70 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
1cf80 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1cf90 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
1cfa0 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
1cfb0 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
1cfc0 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
1cfd0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
1cfe0 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
1cff0 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
1d000 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
1d010 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
1d020 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
1d030 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1d040 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
1d050 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
1d060 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
1d070 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
1d080 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
1d090 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
1d0a0 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
1d0b0 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
1d0c0 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1d0d0 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1d0e0 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
1d0f0 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
1d100 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
1d110 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
1d120 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
1d130 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
1d140 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
1d150 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
1d160 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1d170 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
1d180 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
1d190 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1d1a0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
1d1b0 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
1d1c0 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
1d1d0 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
1d1e0 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
1d1f0 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
1d200 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
1d210 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
1d220 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
1d230 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
1d240 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
1d250 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
1d260 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1d270 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
1d280 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
1d290 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1d2a0 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
1d2b0 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
1d2c0 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
1d2d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1d2e0 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
1d2f0 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
1d300 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
1d310 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
1d320 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
1d330 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
1d340 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1d350 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1d360 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
1d370 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
1d380 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20  TRACE(("SYNC    
1d390 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
1d3a0 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  h));.  rc = full
1d3b0 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
1d3c0 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
1d3d0 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
1d3e0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1d3f0 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
1d400 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1d410 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
1d420 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
1d430 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1d440 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
1d450 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
1d460 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
1d470 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63  .  /* Also fsync
1d480 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
1d490 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69  ontaining the fi
1d4a0 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e  le if the DIRSYN
1d4b0 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73  C flag.  ** is s
1d4c0 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f  et.  This is a o
1d4d0 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e  ne-time occurren
1d4e0 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d  ce.  Many system
1d4f0 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58  s (examples: AIX
1d500 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c  ).  ** are unabl
1d510 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72  e to fsync a dir
1d520 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72  ectory, so ignor
1d530 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20  e errors on the 
1d540 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66  fsync..  */.  if
1d550 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
1d560 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49  gs & UNIXFILE_DI
1d570 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74  RSYNC ){.    int
1d580 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52   dirfd;.    OSTR
1d590 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73  ACE(("DIRSYNC %s
1d5a0 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
1d5b0 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
1d5c0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  \n", pFile->zPat
1d5d0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  h,.            H
1d5e0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
1d5f0 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20  sFullsync));.   
1d600 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
1d610 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61  ctory(pFile->zPa
1d620 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
1d630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d640 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c  OK ){.      full
1d650 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c  _fsync(dirfd, 0,
1d660 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73   0);.      robus
1d670 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64  t_close(pFile, d
1d680 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
1d690 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d6a0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1d6b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b  LITE_CANTOPEN );
1d6c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1d6d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1d6e0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1d6f0 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44  s &= ~UNIXFILE_D
1d700 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65  IRSYNC;.  }.  re
1d710 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d720 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
1d730 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
1d740 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
1d750 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
1d760 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1d770 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
1d780 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
1d790 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1d7a0 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
1d7b0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
1d7c0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
1d7d0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1d7e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1d7f0 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
1d800 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1d810 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1d820 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1d830 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
1d840 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
1d850 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
1d860 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
1d870 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
1d880 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
1d890 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
1d8a0 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
1d8b0 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
1d8c0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1d8d0 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
1d8e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1d8f0 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1d900 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
1d910 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
1d920 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
1d930 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1d940 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
1d950 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
1d960 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1d970 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  h, nByte);.  if(
1d980 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
1d990 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1d9a0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
1d9b0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1d9c0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1d9d0 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1d9e0 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1d9f0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
1da00 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1da10 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1da20 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1da30 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1da40 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1da50 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
1da60 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1da70 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1da80 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1da90 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1daa0 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
1dab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
1dac0 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
1dad0 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1dae0 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
1daf0 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
1db00 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1db10 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
1db20 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
1db30 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
1db40 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
1db50 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
1db60 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
1db70 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
1db80 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
1db90 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1dba0 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
1dbb0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
1dbc0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1dbd0 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
1dbe0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1dbf0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1dc00 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
1dc10 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
1dc20 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
1dc30 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
1dc40 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
1dc50 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
1dc60 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
1dc70 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
1dc80 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
1dc90 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
1dca0 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
1dcb0 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
1dcc0 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
1dcd0 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
1dce0 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
1dcf0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
1dd00 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1dd10 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
1dd20 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
1dd30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1dd40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dd50 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
1dd60 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
1dd70 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
1dd80 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
1dd90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1dda0 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
1ddb0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1ddc0 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1ddd0 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
1dde0 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
1ddf0 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
1de00 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
1de10 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
1de20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1de30 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1de40 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
1de50 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1de60 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
1de70 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
1de80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1de90 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1dea0 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1deb0 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1dec0 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1ded0 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1dee0 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1def0 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1df00 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1df10 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1df20 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1df30 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1df40 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1df50 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1df60 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1df70 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1df80 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1df90 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1dfa0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1dfb0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1dfc0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1dfd0 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1dfe0 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1dff0 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1e000 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1e010 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1e020 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1e030 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1e040 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1e050 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1e060 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1e070 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1e080 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1e090 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1e0a0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1e0b0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1e0c0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1e0d0 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1e0e0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1e0f0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1e100 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1e110 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e120 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1e130 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1e140 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1e150 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1e160 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
1e170 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1e180 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
1e190 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
1e1a0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
1e1b0 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
1e1c0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
1e1d0 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
1e1e0 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
1e1f0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1e200 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1e210 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1e220 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1e230 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1e240 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1e250 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
1e260 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1e270 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1e280 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1e290 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1e2a0 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
1e2b0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
1e2c0 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
1e2d0 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
1e2e0 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
1e2f0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
1e300 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
1e310 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1e320 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  FSTAT;.    }..  
1e330 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74    nSize = ((nByt
1e340 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  e+pFile->szChunk
1e350 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43  -1) / pFile->szC
1e360 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1e370 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20  zChunk;.    if( 
1e380 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73  nSize>(i64)buf.s
1e390 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64  t_size ){..#if d
1e3a0 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
1e3b0 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
1e3c0 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
1e3d0 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68  CATE.      /* Th
1e3e0 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20  e code below is 
1e3f0 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74  handling the ret
1e400 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46  urn value of osF
1e410 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20  allocate() .    
1e420 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
1e430 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1e440 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
1e450 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e  "returns zero on
1e460 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20   success, .     
1e470 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20   ** or an error 
1e480 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75  number on  failu
1e490 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e  re". See the man
1e4a0 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73  page for details
1e4b0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  . */.      int e
1e4c0 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  rr;.      do{.  
1e4d0 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61        err = osFa
1e4e0 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  llocate(pFile->h
1e4f0 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e  , buf.st_size, n
1e500 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65  Size-buf.st_size
1e510 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1e520 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20   err==EINTR );. 
1e530 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72       if( err ) r
1e540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e550 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a  RR_WRITE;.#else.
1e560 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1e570 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  OS does not have
1e580 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1e590 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69  (), fake it. Wri
1e5a0 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73  te a .      ** s
1e5b0 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68  ingle byte to th
1e5c0 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1e5d0 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66  ach block that f
1e5e0 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20  alls entirely.  
1e5f0 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
1e600 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1e610 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75  n. Then, if requ
1e620 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62  ired, a single b
1e630 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  yte.      ** at 
1e640 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29  offset (nSize-1)
1e650 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a  , to set the siz
1e660 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
1e670 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  rrectly..      *
1e680 2a 20 54 68 69 73 20 69 73 20 61 20 73 69 6d 69  * This is a simi
1e690 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f  lar technique to
1e6a0 20 74 68 61 74 20 75 73 65 64 20 62 79 20 67 6c   that used by gl
1e6b0 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20  ibc on systems. 
1e6c0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20       ** that do 
1e6d0 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1e6e0 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c  fallocate() call
1e6f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e700 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1e710 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1e720 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1e730 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1e740 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20  int nWrite = 0; 
1e750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e760 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1e770 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e  ritten by seekAn
1e780 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1e790 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e7b0 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1e7c0 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1e7d0 20 69 57 72 69 74 65 20 3d 20 28 62 75 66 2e 73   iWrite = (buf.s
1e7e0 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c  t_size/nBlk)*nBl
1e7f0 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20  k + nBlk - 1;.  
1e800 20 20 20 20 61 73 73 65 72 74 28 20 69 57 72 69      assert( iWri
1e810 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20  te>=buf.st_size 
1e820 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e830 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e 42 6c   ((iWrite+1)%nBl
1e840 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  k)==0 );.      f
1e850 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57  or(/*no-op*/; iW
1e860 72 69 74 65 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d  rite<nSize+nBlk-
1e870 31 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20  1; iWrite+=nBlk 
1e880 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1e890 57 72 69 74 65 3e 3d 6e 53 69 7a 65 20 29 20 69  Write>=nSize ) i
1e8a0 57 72 69 74 65 20 3d 20 6e 53 69 7a 65 20 2d 20  Write = nSize - 
1e8b0 31 3b 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74  1;.        nWrit
1e8c0 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1e8d0 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20  (pFile, iWrite, 
1e8e0 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  "", 1);.        
1e8f0 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20  if( nWrite!=1 ) 
1e900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e910 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20  ERR_WRITE;.     
1e920 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1e930 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
1e940 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1e950 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
1e960 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42  pSizeMax>0 && nB
1e970 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte>pFile->mmapS
1e980 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ize ){.    int r
1e990 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  c;.    if( pFile
1e9a0 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a  ->szChunk<=0 ){.
1e9b0 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
1e9c0 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1e9d0 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
1e9e0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
1e9f0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
1ea00 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  no);.        ret
1ea10 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1ea20 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1ea30 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1ea40 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1ea50 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1ea60 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  }..    rc = unix
1ea70 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e  Mapfile(pFile, n
1ea80 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Byte);.    retur
1ea90 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
1eaa0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1eab0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1eac0 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
1ead0 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
1eae0 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
1eaf0 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
1eb00 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
1eb10 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
1eb20 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
1eb30 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
1eb40 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
1eb50 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
1eb60 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
1eb70 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
1eb80 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
1eb90 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
1eba0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f  atic void unixMo
1ebb0 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a  deBit(unixFile *
1ebc0 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20  pFile, unsigned 
1ebd0 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a  char mask, int *
1ebe0 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41  pArg){.  if( *pA
1ebf0 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72  rg<0 ){.    *pAr
1ec00 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  g = (pFile->ctrl
1ec10 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30  Flags & mask)!=0
1ec20 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a  ;.  }else if( (*
1ec30 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pArg)==0 ){.    
1ec40 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1ec50 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c   &= ~mask;.  }el
1ec60 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  se{.    pFile->c
1ec70 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  trlFlags |= mask
1ec80 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ;.  }.}../* Forw
1ec90 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1eca0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1ecb0 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  ixGetTempname(in
1ecc0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
1ecd0 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f  uf);../*.** Info
1ece0 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74  rmation and cont
1ecf0 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  rol of an open f
1ed00 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
1ed10 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1ed20 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1ed30 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1ed40 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
1ed50 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1ed60 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1ed70 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  id;.  switch( op
1ed80 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
1ed90 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65  __linux__) && de
1eda0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1edb0 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
1edc0 5f 57 52 49 54 45 29 0a 20 20 20 20 63 61 73 65  _WRITE).    case
1edd0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 45   SQLITE_FCNTL_BE
1ede0 47 49 4e 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  GIN_ATOMIC_WRITE
1edf0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
1ee00 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65   = osIoctl(pFile
1ee10 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 53 54  ->h, F2FS_IOC_ST
1ee20 41 52 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  ART_ATOMIC_WRITE
1ee30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ee40 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc ? SQLITE_IOER
1ee50 52 5f 42 45 47 49 4e 5f 41 54 4f 4d 49 43 20 3a  R_BEGIN_ATOMIC :
1ee60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ee70 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1ee80 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 41  E_FCNTL_COMMIT_A
1ee90 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20  TOMIC_WRITE: {. 
1eea0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73       int rc = os
1eeb0 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Ioctl(pFile->h, 
1eec0 46 32 46 53 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f  F2FS_IOC_COMMIT_
1eed0 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20  ATOMIC_WRITE);. 
1eee0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
1eef0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f   SQLITE_IOERR_CO
1ef00 4d 4d 49 54 5f 41 54 4f 4d 49 43 20 3a 20 53 51  MMIT_ATOMIC : SQ
1ef10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1ef20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1ef30 43 4e 54 4c 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54  CNTL_ROLLBACK_AT
1ef40 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20  OMIC_WRITE: {.  
1ef50 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 49      int rc = osI
1ef60 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  octl(pFile->h, F
1ef70 32 46 53 5f 49 4f 43 5f 41 42 4f 52 54 5f 56 4f  2FS_IOC_ABORT_VO
1ef80 4c 41 54 49 4c 45 5f 57 52 49 54 45 29 3b 0a 20  LATILE_WRITE);. 
1ef90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
1efa0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 4f   SQLITE_IOERR_RO
1efb0 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 20 3a 20  LLBACK_ATOMIC : 
1efc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1efd0 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e  .#endif /* __lin
1efe0 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45  ux__ && SQLITE_E
1eff0 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
1f000 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20  IC_WRITE */..   
1f010 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f020 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
1f030 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1f040 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  g = pFile->eFile
1f050 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75  Lock;.      retu
1f060 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f070 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1f080 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45  ITE_FCNTL_LAST_E
1f090 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
1f0a0 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
1f0b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
1f0c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f0d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1f0e0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f0f0 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
1f100 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43        pFile->szC
1f110 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70  hunk = *(int *)p
1f120 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Arg;.      retur
1f130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1f140 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1f150 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1f160 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  NT: {.      int 
1f170 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  rc;.      Simula
1f180 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1f190 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  1);.      rc = f
1f1a0 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69  cntlSizeHint(pFi
1f1b0 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67  le, *(i64 *)pArg
1f1c0 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1f1d0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1f1e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f1f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  rc;.    }.    ca
1f200 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1f210 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20  PERSIST_WAL: {. 
1f220 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74       unixModeBit
1f230 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45  (pFile, UNIXFILE
1f240 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69  _PERSIST_WAL, (i
1f250 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1f260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f270 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1f280 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1f290 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1f2a0 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  TE: {.      unix
1f2b0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
1f2c0 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  NIXFILE_PSOW, (i
1f2d0 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1f2e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f2f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1f300 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
1f310 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
1f320 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1f330 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1f340 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66  "%s", pFile->pVf
1f350 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s->zName);.     
1f360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f370 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1f380 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
1f390 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
1f3a0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
1f3b0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
1f3c0 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e 70 56 66  oc64( pFile->pVf
1f3d0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
1f3e0 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c  .      if( zTFil
1f3f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69  e ){.        uni
1f400 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69  xGetTempname(pFi
1f410 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
1f420 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20  name, zTFile);. 
1f430 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
1f440 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20  pArg = zTFile;. 
1f450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1f460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f470 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1f480 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
1f490 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28  OVED: {.      *(
1f4a0 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65  int*)pArg = file
1f4b0 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b  HasMoved(pFile);
1f4c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f4d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1f4e0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1f4f0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
1f500 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1f510 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
1f520 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
1f530 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
1f540 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
1f550 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
1f560 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
1f570 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f580 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
1f590 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
1f5a0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f5b0 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
1f5c0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ..      /* The v
1f5d0 61 6c 75 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74  alue of newLimit
1f5e0 20 6d 61 79 20 62 65 20 65 76 65 6e 74 75 61 6c   may be eventual
1f5f0 6c 79 20 63 61 73 74 20 74 6f 20 28 73 69 7a 65  ly cast to (size
1f600 5f 74 29 20 61 6e 64 20 70 61 73 73 65 64 0a 20  _t) and passed. 
1f610 20 20 20 20 20 2a 2a 20 74 6f 20 6d 6d 61 70 28       ** to mmap(
1f620 29 2e 20 52 65 73 74 72 69 63 74 20 69 74 73 20  ). Restrict its 
1f630 76 61 6c 75 65 20 74 6f 20 32 47 42 20 69 66 20  value to 2GB if 
1f640 28 73 69 7a 65 5f 74 29 20 69 73 20 6e 6f 74 20  (size_t) is not 
1f650 61 74 20 6c 65 61 73 74 20 61 0a 20 20 20 20 20  at least a.     
1f660 20 2a 2a 20 36 34 2d 62 69 74 20 74 79 70 65 2e   ** 64-bit type.
1f670 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 65   */.      if( ne
1f680 77 4c 69 6d 69 74 3e 30 20 26 26 20 73 69 7a 65  wLimit>0 && size
1f690 6f 66 28 73 69 7a 65 5f 74 29 3c 38 20 29 7b 0a  of(size_t)<8 ){.
1f6a0 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74          newLimit
1f6b0 20 3d 20 28 6e 65 77 4c 69 6d 69 74 20 26 20 30   = (newLimit & 0
1f6c0 78 37 46 46 46 46 46 46 46 29 3b 0a 20 20 20 20  x7FFFFFFF);.    
1f6d0 20 20 7d 0a 0a 20 20 20 20 20 20 2a 28 69 36 34    }..      *(i64
1f6e0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1f6f0 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20  mmapSizeMax;.   
1f700 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
1f710 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d  =0 && newLimit!=
1f720 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1f730 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65  ax && pFile->nFe
1f740 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  tchOut==0 ){.   
1f750 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1f760 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d  SizeMax = newLim
1f770 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  it;.        if( 
1f780 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e  pFile->mmapSize>
1f790 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
1f7a0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
1f7b0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
1f7c0 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  c = unixMapfile(
1f7d0 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20  pFile, -1);.    
1f7e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f7f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f800 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64     }.#endif.#ifd
1f810 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1f820 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1f830 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
1f840 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61  od to signal tha
1f850 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20  t it has done.  
1f860 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
1f870 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
1f880 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f  abase is therefo
1f890 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  re unchanged and
1f8a0 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65  .    ** it hence
1f8b0 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
1f8c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68  e transaction ch
1f8d0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20  ange counter to 
1f8e0 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e  be.    ** unchan
1f8f0 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ged..    */.    
1f900 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f910 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20  L_DB_UNCHANGED: 
1f920 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1f930 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74  le*)id)->dbUpdat
1f940 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
1f950 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f960 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
1f970 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1f980 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1f990 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1f9a0 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
1f9b0 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b  E_FCNTL_SET_LOCK
1f9c0 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63  PROXYFILE:.    c
1f9d0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f9e0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
1f9f0 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  LE: {.      retu
1fa00 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  rn proxyFileCont
1fa10 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b  rol(id,op,pArg);
1fa20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1fa30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1fa40 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1fa50 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1fa60 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  _) */.  }.  retu
1fa70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
1fa80 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ND;.}../*.** If 
1fa90 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  pFd->sectorSize 
1faa0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  is non-zero when
1fab0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1fac0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
1fad0 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  a.** no-op. Othe
1fae0 72 77 69 73 65 2c 20 74 68 65 20 76 61 6c 75 65  rwise, the value
1faf0 73 20 6f 66 20 70 46 64 2d 3e 73 65 63 74 6f 72  s of pFd->sector
1fb00 53 69 7a 65 20 61 6e 64 20 0a 2a 2a 20 70 46 64  Size and .** pFd
1fb10 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1fb20 72 69 73 74 69 63 73 20 61 72 65 20 73 65 74 20  ristics are set 
1fb30 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1fb40 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a   file-system .**
1fb50 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1fb60 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  . .**.** There a
1fb70 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
1fb80 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1fb90 2e 20 4f 6e 65 20 66 6f 72 20 51 4e 58 20 61 6e  . One for QNX an
1fba0 64 20 6f 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a  d one for all.**
1fbb0 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e 0a   other systems..
1fbc0 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58  */.#ifndef __QNX
1fbd0 4e 54 4f 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69  NTO__.static voi
1fbe0 64 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61  d setDeviceChara
1fbf0 63 74 65 72 69 73 74 69 63 73 28 75 6e 69 78 46  cteristics(unixF
1fc00 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73  ile *pFd){.  ass
1fc10 65 72 74 28 20 70 46 64 2d 3e 64 65 76 69 63 65  ert( pFd->device
1fc20 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3d  Characteristics=
1fc30 3d 30 20 7c 7c 20 70 46 64 2d 3e 73 65 63 74 6f  =0 || pFd->secto
1fc40 72 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 69 66  rSize!=0 );.  if
1fc50 28 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a  ( pFd->sectorSiz
1fc60 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69  e==0 ){.#if defi
1fc70 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26  ned(__linux__) &
1fc80 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1fc90 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
1fca0 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 20 20  OMIC_WRITE).    
1fcb0 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 75 33 32  int res;.    u32
1fcc0 20 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20   f = 0;..    /* 
1fcd0 43 68 65 63 6b 20 66 6f 72 20 73 75 70 70 6f 72  Check for suppor
1fce0 74 20 66 6f 72 20 46 32 46 53 20 61 74 6f 6d 69  t for F2FS atomi
1fcf0 63 20 62 61 74 63 68 20 77 72 69 74 65 73 2e 20  c batch writes. 
1fd00 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 49  */.    res = osI
1fd10 6f 63 74 6c 28 70 46 64 2d 3e 68 2c 20 46 32 46  octl(pFd->h, F2F
1fd20 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54 55 52  S_IOC_GET_FEATUR
1fd30 45 53 2c 20 26 66 29 3b 0a 20 20 20 20 69 66 28  ES, &f);.    if(
1fd40 20 72 65 73 3d 3d 30 20 26 26 20 28 66 20 26 20   res==0 && (f & 
1fd50 46 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f  F2FS_FEATURE_ATO
1fd60 4d 49 43 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  MIC_WRITE) ){.  
1fd70 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43      pFd->deviceC
1fd80 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1fd90 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
1fda0 54 43 48 5f 41 54 4f 4d 49 43 3b 0a 20 20 20 20  TCH_ATOMIC;.    
1fdb0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69  }.#endif /* __li
1fdc0 6e 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f  nux__ && SQLITE_
1fdd0 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f  ENABLE_BATCH_ATO
1fde0 4d 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20  MIC_WRITE */..  
1fdf0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 50 4f 57    /* Set the POW
1fe00 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1fe10 20 66 6c 61 67 20 69 66 20 72 65 71 75 65 73 74   flag if request
1fe20 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
1fe30 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  Fd->ctrlFlags & 
1fe40 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b  UNIXFILE_PSOW ){
1fe50 0a 20 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69  .      pFd->devi
1fe60 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fe70 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41  s |= SQLITE_IOCA
1fe80 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1fe90 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  WRITE;.    }..  
1fea0 20 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a    pFd->sectorSiz
1feb0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1fec0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1fed0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e 63    }.}.#else.#inc
1fee0 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62  lude <sys/dcmd_b
1fef0 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  lk.h>.#include <
1ff00 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73  sys/statvfs.h>.s
1ff10 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 44 65  tatic void setDe
1ff20 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1ff30 69 63 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ics(unixFile *pF
1ff40 69 6c 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c  ile){.  if( pFil
1ff50 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d  e->sectorSize ==
1ff60 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   0 ){.    struct
1ff70 20 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b   statvfs fsInfo;
1ff80 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20  .       .    /* 
1ff90 53 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72  Set defaults for
1ffa0 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66   non-supported f
1ffb0 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ilesystems */.  
1ffc0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1ffd0 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
1ffe0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1fff0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76  ;.    pFile->dev
20000 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
20010 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  cs = 0;.    if( 
20020 66 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e  fstatvfs(pFile->
20030 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
20040 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  1 ) {.      retu
20050 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rn;.    }..    i
20060 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
20070 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74  o.f_basetype, "t
20080 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70  mp") ) {.      p
20090 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
200a0 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
200b0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
200c0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
200d0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
200e0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
200f0 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a  MIC4K |       /*
20100 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73   All ram filesys
20110 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61  tem writes are a
20120 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
20130 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
20140 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
20150 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
20160 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
20170 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
201a0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
201b0 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
201c0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
201d0 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
201e0 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
201f0 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
20200 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20220 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20230 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
20240 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
20250 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
20260 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
20270 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29  etype, "etfs") )
20280 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
20290 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
202a0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
202b0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
202c0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
202d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73  .        /* etfs
202e0 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72   cluster size wr
202f0 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
20300 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c  */.        (pFil
20310 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
20320 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
20330 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a  AP_ATOMIC512) |.
20340 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
20350 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
20360 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
20370 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
20380 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203b0 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
203c0 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
203d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
203e0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
203f0 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
20400 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
20410 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
20450 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
20460 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
20470 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
20480 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
20490 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx6") ){.      
204a0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
204b0 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
204c0 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
204d0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
204e0 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
204f0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
20500 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f  OMIC |         /
20510 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d  * All filesystem
20520 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
20530 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
20540 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
20550 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
20560 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
20570 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20580 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
205b0 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
205c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
205d0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
205e0 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
205f0 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
20600 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
20610 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20630 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
20640 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
20650 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
20660 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d  }else if( !strcm
20670 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
20680 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a  ype, "qnx4") ){.
20690 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
206a0 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
206b0 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
206c0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
206d0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
206e0 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
206f0 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
20700 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
20710 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
20720 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
20730 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
20740 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
20750 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
20760 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
20770 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
20780 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
20790 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
207a0 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
207b0 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
207c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207e0 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
207f0 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
20800 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
20810 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f  f( strstr(fsInfo
20820 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f  .f_basetype, "do
20830 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
20840 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
20850 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
20860 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
20870 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20880 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
20890 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
208a0 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
208b0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
208c0 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
208d0 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
208e0 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
208f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
20900 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
20910 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
20920 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
20930 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
20940 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
20950 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
20960 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
20990 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
209a0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
209b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
209c0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
209d0 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
209e0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
209f0 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20  _ATOMIC512 |    
20a00 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20    /* blocks are 
20a10 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
20a20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
20a30 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
20a40 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
20a50 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
20a60 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
20a90 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
20aa0 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
20ab0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  0;.    }.  }.  /
20ac0 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65  * Last chance ve
20ad0 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20  rification.  If 
20ae0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
20af0 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65  isn't a multiple
20b00 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65   of 512.  ** the
20b10 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64  n it isn't valid
20b20 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .*/.  if( pFile-
20b30 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31  >sectorSize % 51
20b40 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  2 != 0 ){.    pF
20b50 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
20b60 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
20b70 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
20b80 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
20b90 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
20ba0 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  ZE;.  }.}.#endif
20bb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20bc0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
20bd0 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
20be0 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
20bf0 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
20c00 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
20c10 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
20c20 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
20c30 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
20c40 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
20c50 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
20c60 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
20c70 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
20c80 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
20c90 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
20ca0 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
20cb0 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
20cc0 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
20cd0 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
20ce0 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
20cf0 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
20d00 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
20d10 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
20d20 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
20d30 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
20d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
20d50 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
20d60 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
20d70 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
20d80 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
20d90 20 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61    setDeviceChara
20da0 63 74 65 72 69 73 74 69 63 73 28 70 46 64 29 3b  cteristics(pFd);
20db0 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e 73  .  return pFd->s
20dc0 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  ectorSize;.}../*
20dd0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
20de0 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
20df0 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69  stics for the fi
20e00 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56  le..**.** This V
20e10 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20  FS is set up to 
20e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
20e30 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
20e40 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75  ERWRITE by defau
20e50 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  lt..** However, 
20e60 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63  that choice is c
20e70 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e  ontroversial sin
20e80 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74  ce technically t
20e90 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a  he underlying.**
20ea0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65   file system doe
20eb0 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f  s not always pro
20ec0 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f  vide powersafe o
20ed0 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20  verwrites.  (In 
20ee0 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
20ef0 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f  after a power-lo
20f00 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20  ss event, parts 
20f10 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  of the file that
20f20 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77   were never.** w
20f30 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64  ritten might end
20f40 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65   up being altere
20f50 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f  d.)  However, no
20f60 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20  n-PSOW behavior 
20f70 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79  is very,.** very
20f80 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65   rare.  And asse
20f90 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73  rting PSOW makes
20fa0 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69   a large reducti
20fb0 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74  on in the amount
20fc0 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20  .** of required 
20fd0 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69  I/O for journali
20fe0 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20  ng, since a lot 
20ff0 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c  of padding is el
21000 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65  iminated..**  He
21010 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52  nce, while POWER
21020 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69  SAFE_OVERWRITE i
21030 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c  s on by default,
21040 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65   there is a file
21050 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69  -control.** avai
21060 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
21070 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65   off and URI que
21080 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61  ry parameter ava
21090 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
210a0 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  t off..*/.static
210b0 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43   int unixDeviceC
210c0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
210d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
210e0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
210f0 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  d = (unixFile*)i
21100 64 3b 0a 20 20 73 65 74 44 65 76 69 63 65 43 68  d;.  setDeviceCh
21110 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 46  aracteristics(pF
21120 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64  d);.  return pFd
21130 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
21140 72 69 73 74 69 63 73 3b 0a 7d 0a 0a 23 69 66 20  ristics;.}..#if 
21150 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
21160 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
21170 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
21180 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  E>0../*.** Retur
21190 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67  n the system pag
211a0 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
211b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
211c0 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ld not be called
211d0 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68   directly by oth
211e0 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  er code in this 
211f0 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61  file. .** Instea
21200 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  d, it should be 
21210 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f  called via macro
21220 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29   osGetpagesize()
21230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21240 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28  unixGetpagesize(
21250 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58  void){.#if OS_VX
21260 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31  WORKS.  return 1
21270 30 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  024;.#elif defin
21280 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a  ed(_BSD_SOURCE).
21290 20 20 72 65 74 75 72 6e 20 67 65 74 70 61 67 65    return getpage
212a0 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20  size();.#else.  
212b0 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63  return (int)sysc
212c0 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45  onf(_SC_PAGESIZE
212d0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e  );.#endif.}..#en
212e0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
212f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
21300 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
21310 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23  MAP_SIZE>0 */..#
21320 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21330 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62  IT_WAL../*.** Ob
21340 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
21350 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64  resent an shared
21360 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20   memory buffer. 
21370 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c   .**.** When mul
21380 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
21390 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
213a0 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20  same wal-index, 
213b0 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68  each thread.** h
213c0 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53  as its own unixS
213d0 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  hm object, but t
213e0 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f  hey all point to
213f0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
21400 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e  ce.** of this un
21410 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
21420 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
21430 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65  s, each wal-inde
21440 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  x is opened.** o
21450 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
21460 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  cess..**.** Each
21470 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
21480 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  ect is connected
21490 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69   to a single uni
214a0 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
214b0 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63  t..** We could c
214c0 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a  oalesce this obj
214d0 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f  ect into unixIno
214e0 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74  deInfo, but that
214f0 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65   would mean.** e
21500 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74  very open file t
21510 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
21520 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28   shared memory (
21530 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
21540 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c  most.** open fil
21550 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74  es) would have t
21560 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74  o carry around t
21570 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  his extra inform
21580 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68  ation.  So.** th
21590 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
215a0 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
215b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
215c0 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
215d0 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ject.** and the 
215e0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
215f0 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e  ct is created on
21600 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a  ly when needed..
21610 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  **.** unixMutexH
21620 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
21630 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
21640 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
21650 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
21660 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
21670 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
21680 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
21690 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
216a0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
216b0 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72  ing fields are r
216c0 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74  ead-only after t
216d0 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  he object is cre
216e0 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20  ated:.** .**    
216f0 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46    fid.**      zF
21700 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69  ilename.**.** Ei
21710 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ther unixShmNode
21720 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  .mutex must be h
21730 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f  eld or unixShmNo
21740 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a  de.nRef==0 and.*
21750 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  * unixMutexHeld(
21760 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72  ) is true when r
21770 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
21780 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c  g any other fiel
21790 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72  d.** in this str
217a0 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
217b0 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a  t unixShmNode {.
217c0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
217d0 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  *pInode;     /* 
217e0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68  unixInodeInfo th
217f0 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d  at owns this SHM
21800 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   node */.  sqlit
21810 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
21820 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
21830 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
21840 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
21850 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
21860 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
21870 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  the mmapped file
21880 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
218b0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e  scriptor */.  in
218c0 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20  t szRegion;     
218d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
218e0 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
218f0 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75  y regions */.  u
21900 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20  16 nRegion;     
21910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
21920 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67  e of array apReg
21930 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65  ion */.  u8 isRe
21940 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adonly;         
21950 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
21960 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38  ead-only */.  u8
21970 20 69 73 55 6e 6c 6f 63 6b 65 64 3b 20 20 20 20   isUnlocked;    
21980 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
21990 20 69 66 20 6e 6f 20 44 4d 53 20 6c 6f 63 6b 20   if no DMS lock 
219a0 68 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  held */.  char *
219b0 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  *apRegion;      
219c0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
219d0 20 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d   mapped shared-m
219e0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
219f0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a10 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53   Number of unixS
21a20 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
21a30 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
21a40 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74   unixShm *pFirst
21a50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
21a60 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  ll unixShm objec
21a70 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
21a80 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  his */.#ifdef SQ
21a90 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
21aa0 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
21ab0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
21ac0 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
21ad0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
21ae0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
21af0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
21b00 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
21b10 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78  held */.  u8 nex
21b20 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20  tShmId;         
21b30 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61       /* Next ava
21b40 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69  ilable unixShm.i
21b50 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
21b60 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  f.};../*.** Stru
21b70 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72  cture used inter
21b80 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46  nally by this VF
21b90 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  S to record the 
21ba0 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f  state of an.** o
21bb0 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  pen shared memor
21bc0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  y connection..**
21bd0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
21be0 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
21bf0 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
21c00 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  is object is cre
21c10 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20  ated and.** are 
21c20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61  read-only therea
21c30 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75  fter:.**.**    u
21c40 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20  nixShm.pFile.** 
21c50 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a     unixShm.id.**
21c60 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  .** All other fi
21c70 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72  elds are read/wr
21c80 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68  ite.  The unixSh
21c90 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d  m.pFile->mutex m
21ca0 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
21cb0 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
21cc0 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
21cd0 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
21ce0 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78  unixShm {.  unix
21cf0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
21d00 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  e;     /* The un
21d10 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d  derlying unixShm
21d20 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Node object */. 
21d30 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b   unixShm *pNext;
21d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21d50 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68  ext unixShm with
21d60 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68   the same unixSh
21d70 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
21d80 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
21d90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
21da0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69   holding the uni
21db0 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  xShmNode mutex *
21dc0 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  /.  u8 id;      
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21de0 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
21df0 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69  nection within i
21e00 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ts unixShmNode *
21e10 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
21e20 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
21e30 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
21e40 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
21e50 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
21e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21e70 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
21e80 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d   locks held */.}
21e90 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  ;../*.** Constan
21ea0 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ts used for lock
21eb0 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ing.*/.#define U
21ec0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28  NIX_SHM_BASE   (
21ed0 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  (22+SQLITE_SHM_N
21ee0 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20  LOCK)*4)        
21ef0 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62   /* first lock b
21f00 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  yte */.#define U
21f10 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28  NIX_SHM_DMS    (
21f20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51  UNIX_SHM_BASE+SQ
21f30 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20  LITE_SHM_NLOCK) 
21f40 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74   /* deadman swit
21f50 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ch */../*.** App
21f60 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  ly posix advisor
21f70 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20  y locks for all 
21f80 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20  bytes from ofst 
21f90 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31  through ofst+n-1
21fa0 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c  ..**.** Locks bl
21fb0 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20  ock if the mask 
21fc0 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f  is exactly UNIX_
21fd0 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f  SHM_C and are no
21fe0 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74  n-blocking.** ot
21ff0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
22000 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79  ic int unixShmSy
22010 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78  stemLock(.  unix
22020 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
22030 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65     /* Open conne
22040 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 57 41 4c  ction to the WAL
22050 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c   file */.  int l
22060 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
22070 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f    /* F_UNLCK, F_
22080 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43  RDLCK, or F_WRLC
22090 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  K */.  int ofst,
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
220b0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
220c0 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
220d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20   */.  int n     
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
220f0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
22100 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  to lock */.){.  
22110 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
22120 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c 79 20  mNode; /* Apply 
22130 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
22140 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
22150 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 74   segment */.  st
22160 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20  ruct flock f;   
22170 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69       /* The posi
22180 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69  x advisory locki
22190 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ng structure */.
221a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
221b0 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 73 75  E_OK;    /* Resu
221c0 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e  lt code form fcn
221d0 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  tl() */..  /* Ac
221e0 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78  cess to the unix
221f0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
22200 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
22210 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
22220 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65  pShmNode = pFile
22230 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
22240 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  de;.  assert( pS
22250 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
22260 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
22270 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  _held(pShmNode->
22280 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
22290 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76  Shared locks nev
222a0 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61  er span more tha
222b0 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20  n one byte */.  
222c0 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
222d0 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43  lockType!=F_RDLC
222e0 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73  K );..  /* Locks
222f0 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
22300 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
22310 3e 3d 31 20 26 26 20 6e 3c 3d 53 51 4c 49 54 45  >=1 && n<=SQLITE
22320 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  _SHM_NLOCK );.. 
22330 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
22340 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  >=0 ){.    /* In
22350 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
22360 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
22370 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66  */.    memset(&f
22380 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b  , 0, sizeof(f));
22390 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20  .    f.l_type = 
223a0 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e  lockType;.    f.
223b0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
223c0 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61  SET;.    f.l_sta
223d0 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66  rt = ofst;.    f
223e0 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20  .l_len = n;..   
223f0 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53   rc = osFcntl(pS
22400 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54  hmNode->h, F_SET
22410 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20  LK, &f);.    rc 
22420 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53  = (rc!=(-1)) ? S
22430 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
22440 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BUSY;.  }..  /
22450 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
22460 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
22470 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
22480 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
22490 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75  LITE_DEBUG.  { u
224a0 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41  16 mask;.  OSTRA
224b0 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29  CE(("SHM-LOCK ")
224c0 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74  );.  mask = ofst
224d0 3e 33 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28  >31 ? 0xffff : (
224e0 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
224f0 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20  1<<ofst);.  if( 
22500 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22510 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
22520 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
22530 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
22540 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
22550 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
22560 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
22570 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
22580 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
22590 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
225a0 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
225b0 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
225c0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
225d0 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  read-lock %d ok"
225e0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
225f0 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
22600 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
22610 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
22620 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
22630 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22640 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
22650 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
22660 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
22670 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  rite-lock %d ok"
22680 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
22690 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
226a0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
226b0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
226c0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
226d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
226e0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
226f0 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
22700 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
22710 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
22720 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  ofst));.    }els
22730 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
22740 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
22750 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
22760 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a  lock failed"));.
22770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22780 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
22790 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
227a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
227b0 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ite-lock %d fail
227c0 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
227d0 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
227e0 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73  ((" - afterwards
227f0 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
22800 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
22810 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20  de->sharedMask, 
22820 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
22830 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sk));.  }.#endif
22840 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ..  return rc;  
22850 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20        .}../*.** 
22860 52 65 74 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d  Return the minim
22870 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b  um number of 32K
22880 42 20 73 68 6d 20 72 65 67 69 6f 6e 73 20 74 68  B shm regions th
22890 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 70  at should be map
228a0 70 65 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65  ped at.** a time
228b0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
228c0 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73  each mapping mus
228d0 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  t be an integer 
228e0 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 0a  multiple of the.
228f0 2a 2a 20 63 75 72 72 65 6e 74 20 73 79 73 74 65  ** current syste
22900 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a  m page-size..**.
22910 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73  ** Usually, this
22920 20 69 73 20 31 2e 20 54 68 65 20 65 78 63 65 70   is 1. The excep
22930 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62 65  tion seems to be
22940 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72   systems that ar
22950 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20  e configured.** 
22960 74 6f 20 75 73 65 20 36 34 4b 42 20 70 61 67 65  to use 64KB page
22970 73 20 2d 20 69 6e 20 74 68 69 73 20 63 61 73 65  s - in this case
22980 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75   each mapping mu
22990 73 74 20 63 6f 76 65 72 20 61 74 20 6c 65 61 73  st cover at leas
229a0 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67  t two.** shm reg
229b0 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
229c0 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 67 69 6f  int unixShmRegio
229d0 6e 50 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20  nPerMap(void){. 
229e0 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a   int shmsz = 32*
229f0 31 30 32 34 3b 20 20 20 20 20 20 20 20 20 20 20  1024;           
22a00 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20 73   /* SHM region s
22a10 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73  ize */.  int pgs
22a20 7a 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a  z = osGetpagesiz
22a30 65 28 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d  e();   /* System
22a40 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
22a50 61 73 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31  assert( ((pgsz-1
22a60 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20  )&pgsz)==0 );   
22a70 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73  /* Page size mus
22a80 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
22a90 32 20 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c  2 */.  if( pgsz<
22aa0 73 68 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31  shmsz ) return 1
22ab0 3b 0a 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f  ;.  return pgsz/
22ac0 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  shmsz;.}../*.** 
22ad0 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68  Purge the unixSh
22ae0 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
22af0 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
22b00 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  th unixShmNode.n
22b10 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
22b20 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
22b30 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
22b40 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
22b50 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
22b60 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
22b70 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
22b80 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
22b90 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72   void unixShmPur
22ba0 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  ge(unixFile *pFd
22bb0 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
22bc0 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64   *p = pFd->pInod
22bd0 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
22be0 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
22bf0 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
22c00 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e  p && ALWAYS(p->n
22c10 52 65 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69  Ref==0) ){.    i
22c20 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20  nt nShmPerMap = 
22c30 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72  unixShmRegionPer
22c40 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69  Map();.    int i
22c50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
22c60 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49  >pInode==pFd->pI
22c70 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  node );.    sqli
22c80 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
22c90 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f  ->mutex);.    fo
22ca0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
22cb0 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d  ion; i+=nShmPerM
22cc0 61 70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ap){.      if( p
22cd0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
22ce0 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70    osMunmap(p->ap
22cf0 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a  Region[i], p->sz
22d00 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
22d10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
22d20 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
22d30 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20  Region[i]);.    
22d40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
22d50 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
22d60 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28  Region);.    if(
22d70 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
22d80 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
22d90 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  Fd, p->h, __LINE
22da0 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20  __);.      p->h 
22db0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
22dc0 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  p->pInode->pShmN
22dd0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ode = 0;.    sql
22de0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
22df0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44  }.}../*.** The D
22e00 4d 53 20 6c 6f 63 6b 20 68 61 73 20 6e 6f 74 20  MS lock has not 
22e10 79 65 74 20 62 65 65 6e 20 74 61 6b 65 6e 20 6f  yet been taken o
22e20 6e 20 73 68 6d 20 66 69 6c 65 20 70 53 68 6d 4e  n shm file pShmN
22e30 6f 64 65 2e 20 41 74 74 65 6d 70 74 20 74 6f 0a  ode. Attempt to.
22e40 2a 2a 20 74 61 6b 65 20 69 74 20 6e 6f 77 2e 20  ** take it now. 
22e50 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22e60 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
22e70 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
22e80 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  or.** code other
22e90 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  wise..**.** If t
22ea0 68 65 20 44 4d 53 20 63 61 6e 6e 6f 74 20 62 65  he DMS cannot be
22eb0 20 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 20   locked because 
22ec0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 6f 6e  this is a readon
22ed0 6c 79 5f 73 68 6d 3d 31 20 0a 2a 2a 20 63 6f 6e  ly_shm=1 .** con
22ee0 6e 65 63 74 69 6f 6e 20 61 6e 64 20 6e 6f 20 6f  nection and no o
22ef0 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 6c 72  ther process alr
22f00 65 61 64 79 20 68 6f 6c 64 73 20 61 20 6c 6f 63  eady holds a loc
22f10 6b 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  k, return.** SQL
22f20 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
22f30 54 49 4e 49 54 20 61 6e 64 20 73 65 74 20 70 53  TINIT and set pS
22f40 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b  hmNode->isUnlock
22f50 65 64 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ed=1..*/.static 
22f60 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72  int unixLockShar
22f70 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c  edMemory(unixFil
22f80 65 20 2a 70 44 62 46 64 2c 20 75 6e 69 78 53 68  e *pDbFd, unixSh
22f90 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 29  mNode *pShmNode)
22fa0 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
22fb0 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
22fc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
22fd0 2f 2a 20 55 73 65 20 46 5f 47 45 54 4c 4b 20 74  /* Use F_GETLK t
22fe0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
22ff0 6c 6f 63 6b 73 20 6f 74 68 65 72 20 70 72 6f 63  locks other proc
23000 65 73 73 65 73 20 61 72 65 20 68 6f 6c 64 69 6e  esses are holdin
23010 67 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 44 4d  g.  ** on the DM
23020 53 20 62 79 74 65 2e 20 49 66 20 69 74 20 69 6e  S byte. If it in
23030 64 69 63 61 74 65 73 20 74 68 61 74 20 61 6e 6f  dicates that ano
23040 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
23050 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 61 20 53  holding.  ** a S
23060 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  HARED lock, then
23070 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6d 61   this process ma
23080 79 20 61 6c 73 6f 20 74 61 6b 65 20 61 20 53 48  y also take a SH
23090 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61  ARED lock.  ** a
230a0 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  nd proceed with 
230b0 6f 70 65 6e 69 6e 67 20 74 68 65 20 2a 2d 73 68  opening the *-sh
230c0 6d 20 66 69 6c 65 2e 20 0a 20 20 2a 2a 0a 20 20  m file. .  **.  
230d0 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f 20 6f 74 68  ** Or, if no oth
230e0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
230f0 6c 64 69 6e 67 20 61 6e 79 20 6c 6f 63 6b 2c 20  lding any lock, 
23100 74 68 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73  then this proces
23110 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 66 69  s.  ** is the fi
23120 72 73 74 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20  rst to open it. 
23130 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 61 6b  In this case tak
23140 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
23150 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
23160 44 4d 53 20 62 79 74 65 20 61 6e 64 20 74 72 75  DMS byte and tru
23170 6e 63 61 74 65 20 74 68 65 20 2a 2d 73 68 6d 20  ncate the *-shm 
23180 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
23190 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 65 6e  es in size. Then
231a0 0a 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 20  .  ** downgrade 
231b0 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
231c0 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74 65   on the DMS byte
231d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61  ..  **.  ** If a
231e0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
231f0 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
23200 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
23210 68 65 20 44 4d 53 20 62 79 74 65 2c 0a 20 20 2a  he DMS byte,.  *
23220 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
23230 42 55 53 59 20 74 6f 20 74 68 65 20 63 61 6c 6c  BUSY to the call
23240 65 72 20 28 69 74 20 77 69 6c 6c 20 74 72 79 20  er (it will try 
23250 61 67 61 69 6e 29 2e 20 41 6e 20 65 61 72 6c 69  again). An earli
23260 65 72 0a 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  er.  ** version 
23270 6f 66 20 74 68 69 73 20 63 6f 64 65 20 61 74 74  of this code att
23280 65 6d 70 74 65 64 20 74 68 65 20 53 48 41 52 45  empted the SHARE
23290 44 20 6c 6f 63 6b 20 61 74 20 74 68 69 73 20 70  D lock at this p
232a0 6f 69 6e 74 2e 20 42 75 74 0a 20 20 2a 2a 20 74  oint. But.  ** t
232b0 68 69 73 20 69 6e 74 72 6f 64 75 63 65 64 20 61  his introduced a
232c0 20 73 75 62 74 6c 65 20 72 61 63 65 20 63 6f 6e   subtle race con
232d0 64 69 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 70  dition: if the p
232e0 72 6f 63 65 73 73 20 68 6f 6c 64 69 6e 67 0a 20  rocess holding. 
232f0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 66 61   ** EXCLUSIVE fa
23300 69 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  iled just before
23310 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20   truncating the 
23320 2a 2d 73 68 6d 20 66 69 6c 65 2c 20 74 68 65 6e  *-shm file, then
23330 20 74 68 69 73 0a 20 20 2a 2a 20 70 72 6f 63 65   this.  ** proce
23340 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 61 6e  ss might open an
23350 64 20 75 73 65 20 74 68 65 20 2a 2d 73 68 6d 20  d use the *-shm 
23360 66 69 6c 65 20 77 69 74 68 6f 75 74 20 74 72 75  file without tru
23370 6e 63 61 74 69 6e 67 20 69 74 2e 0a 20 20 2a 2a  ncating it..  **
23380 20 41 6e 64 20 69 66 20 74 68 65 20 2a 2d 73 68   And if the *-sh
23390 6d 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  m file has been 
233a0 63 6f 72 72 75 70 74 65 64 20 62 79 20 61 20 70  corrupted by a p
233b0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 72 0a  ower failure or.
233c0 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61 73    ** system cras
233d0 68 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  h, the database 
233e0 69 74 73 65 6c 66 20 6d 61 79 20 61 6c 73 6f 20  itself may also 
233f0 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20  become corrupt. 
23400 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65   */.  lock.l_whe
23410 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
23420 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
23430 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 3b 0a 20   UNIX_SHM_DMS;. 
23440 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
23450 0a 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d  .  lock.l_type =
23460 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 69 66 28 20   F_WRLCK;.  if( 
23470 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65  osFcntl(pShmNode
23480 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
23490 6f 63 6b 29 21 3d 30 20 29 20 7b 0a 20 20 20 20  ock)!=0 ) {.    
234a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
234b0 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 20  R_LOCK;.  }else 
234c0 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d  if( lock.l_type=
234d0 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
234e0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
234f0 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20  Readonly ){.    
23500 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e    pShmNode->isUn
23510 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20  locked = 1;.    
23520 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
23530 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 3b  ADONLY_CANTINIT;
23540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23550 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
23560 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
23570 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48  F_WRLCK, UNIX_SH
23580 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20  M_DMS, 1);.     
23590 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
235a0 4f 4b 20 26 26 20 72 6f 62 75 73 74 5f 66 74 72  OK && robust_ftr
235b0 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
235c0 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  >h, 0) ){.      
235d0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
235e0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
235f0 5f 53 48 4d 4f 50 45 4e 2c 22 66 74 72 75 6e 63  _SHMOPEN,"ftrunc
23600 61 74 65 22 2c 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ate",pShmNode->z
23610 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
23620 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
23630 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
23640 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
23650 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
23660 59 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  Y;.  }..  if( rc
23670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23680 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 2e     assert( lock.
23690 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
236a0 7c 7c 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d  || lock.l_type==
236b0 46 5f 52 44 4c 43 4b 20 29 3b 0a 20 20 20 20 72  F_RDLCK );.    r
236c0 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
236d0 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52  mLock(pDbFd, F_R
236e0 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  DLCK, UNIX_SHM_D
236f0 4d 53 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  MS, 1);.  }.  re
23700 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23710 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d  * Open a shared-
23720 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f  memory area asso
23730 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e  ciated with open
23740 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
23750 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20  DbFd.  .** This 
23760 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65  particular imple
23770 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d  mentation uses m
23780 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a  mapped files..**
23790 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65  .** The file use
237a0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
237b0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20  hared-memory is 
237c0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
237d0 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20  ctory.** as the 
237e0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
237f0 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  le and has the s
23800 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
23810 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  open database.**
23820 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22   file with the "
23830 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64  -shm" suffix add
23840 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ed.  For example
23850 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  , if the databas
23860 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68  e file.** is "/h
23870 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67  ome/user1/config
23880 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69  .db" then the fi
23890 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74  le that is creat
238a0 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a  ed and mmapped.*
238b0 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  * for shared mem
238c0 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ory will be call
238d0 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f  ed "/home/user1/
238e0 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20  config.db-shm". 
238f0 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20   .**.** Another 
23900 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74  approach to is t
23910 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f  o use files in /
23920 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f  dev/shm or /dev/
23930 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d  tmp or an.** som
23940 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f  e other tmpfs mo
23950 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69  unt. But if a fi
23960 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  le in a differen
23970 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66  t directory.** f
23980 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
23990 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74   file is used, t
239a0 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63  hen differing ac
239b0 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
239c0 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28  .** or a chroot(
239d0 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77  ) might cause tw
239e0 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  o different proc
239f0 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  esses on the sam
23a00 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f  e.** database to
23a10 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69   end up using di
23a20 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f  fferent files fo
23a30 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
23a40 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68  - .** meaning th
23a50 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  at their memory 
23a60 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79  would not really
23a70 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73   be shared - res
23a80 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74  ulting.** in dat
23a90 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
23aa0 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
23ab0 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65   this tmpfs file
23ac0 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65   usage.** can be
23ad0 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
23ae0 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d  ile-time using -
23af0 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  DSQLITE_SHM_DIRE
23b00 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22  CTORY="/dev/shm"
23b10 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76  .** or the equiv
23b20 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20  alent.  The use 
23b30 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48  of the SQLITE_SH
23b40 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
23b50 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69  ile-time.** opti
23b60 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  on results in an
23b70 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75   incompatible bu
23b80 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20  ild of SQLite;  
23b90 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65  builds of SQLite
23ba0 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69  .** that with di
23bb0 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53  ffering SQLITE_S
23bc0 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74  HM_DIRECTORY set
23bd0 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f  tings attempt to
23be0 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   use the.** same
23bf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
23c00 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
23c10 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
23c20 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  tion will likely
23c30 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20  .** result. The 
23c40 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
23c50 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
23c60 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73  e option is cons
23c70 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70  idered.** "unsup
23c80 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20  ported" and may 
23c90 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74  go away in a fut
23ca0 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61  ure SQLite relea
23cb0 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  se..**.** When o
23cc0 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
23cd0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
23ce0 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
23cf0 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
23d00 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
23d10 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
23d20 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
23d30 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
23d40 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
23d50 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
23d60 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
23d70 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
23d80 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
23d90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69  **.** If the ori
23da0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
23db0 69 6c 65 20 28 70 44 62 46 64 29 20 69 73 20 75  ile (pDbFd) is u
23dc0 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65  sing the "unix-e
23dd0 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74  xcl" VFS.** that
23de0 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65   means that an e
23df0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
23e00 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
23e10 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a  abase file and.*
23e20 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  * that no other 
23e30 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 61 62  processes are ab
23e40 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  le to read or wr
23e50 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
23e60 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61  .  In.** that ca
23e70 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65  se, we do not re
23e80 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64  ally need shared
23e90 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61   memory.  No sha
23ea0 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69  red memory.** fi
23eb0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  le is created.  
23ec0 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
23ed0 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61  y will be simula
23ee0 74 65 64 20 77 69 74 68 20 68 65 61 70 20 6d 65  ted with heap me
23ef0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
23f00 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  int unixOpenShar
23f10 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c  edMemory(unixFil
23f20 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72  e *pDbFd){.  str
23f30 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  uct unixShm *p =
23f40 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
23f50 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
23f60 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
23f70 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e   struct unixShmN
23f80 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
23f90 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
23fa0 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
23fb0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
23fc0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
23fd0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
23fe0 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ode */.  unixIno
23ff0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
24000 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24010 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20  inode of fd */. 
24020 20 63 68 61 72 20 2a 7a 53 68 6d 3b 20 20 20 20   char *zShm;    
24030 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
24040 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65   of the file use
24050 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69  d for SHM */.  i
24060 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  nt nShmFilename;
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24080 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48  * Size of the SH
24090 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79  M filename in by
240a0 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  tes */..  /* All
240b0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
240c0 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20  the new unixShm 
240d0 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d  object. */.  p =
240e0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
240f0 34 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  4( sizeof(*p) );
24100 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
24110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
24120 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 73 65 74  M_BKPT;.  memset
24130 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
24140 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  ));.  assert( pD
24150 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  bFd->pShm==0 );.
24160 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
24170 65 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e  ee if a unixShmN
24180 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61  ode object alrea
24190 64 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65  dy exists. Reuse
241a0 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
241b0 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74  * one if present
241c0 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f  . Create a new o
241d0 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
241e0 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
241f0 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
24200 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
24210 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  de;.  pShmNode =
24220 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
24230 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  e;.  if( pShmNod
24240 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  e==0 ){.    stru
24250 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24270 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66  * fstat() info f
24280 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  or database file
24290 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
242a0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
242b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
242c0 2a 7a 42 61 73 65 50 61 74 68 20 3d 20 70 44 62  *zBasePath = pDb
242d0 46 64 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69  Fd->zPath;.#endi
242e0 66 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66  f..    /* Call f
242f0 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65  stat() to figure
24300 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73   out the permiss
24310 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61  ions on the data
24320 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20  base file. If.  
24330 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d    ** a new *-shm
24340 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
24350 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c  , an attempt wil
24360 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65  l be made to cre
24370 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69  ate it.    ** wi
24380 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  th the same perm
24390 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a  issions..    */.
243a0 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
243b0 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74  pDbFd->h, &sStat
243c0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
243d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
243e0 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
243f0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
24400 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
24410 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
24420 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
24430 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
24440 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
24450 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 31;.#else.    
24460 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36  nShmFilename = 6
24470 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   + (int)strlen(z
24480 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64 69  BasePath);.#endi
24490 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  f.    pShmNode =
244a0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
244b0 34 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  4( sizeof(*pShmN
244c0 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e  ode) + nShmFilen
244d0 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ame );.    if( p
244e0 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
244f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24500 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
24510 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
24520 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  err;.    }.    m
24530 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20  emset(pShmNode, 
24540 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  0, sizeof(*pShmN
24550 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d  ode)+nShmFilenam
24560 65 29 3b 0a 20 20 20 20 7a 53 68 6d 20 3d 20 70  e);.    zShm = p
24570 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
24580 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68  me = (char*)&pSh
24590 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66  mNode[1];.#ifdef
245a0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
245b0 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65  CTORY.    sqlite
245c0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
245d0 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 0a  ilename, zShm, .
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f       SQLITE_SHM_
24600 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69  DIRECTORY "/sqli
24610 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20  te-shm-%x-%x",. 
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24630 20 20 20 20 28 75 33 32 29 73 53 74 61 74 2e 73      (u32)sStat.s
24640 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61  t_ino, (u32)sSta
24650 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65  t.st_dev);.#else
24660 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
24670 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
24680 6d 65 2c 20 7a 53 68 6d 2c 20 22 25 73 2d 73 68  me, zShm, "%s-sh
24690 6d 22 2c 20 7a 42 61 73 65 50 61 74 68 29 3b 0a  m", zBasePath);.
246a0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
246b0 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
246c0 61 74 68 2c 20 7a 53 68 6d 29 3b 0a 23 65 6e 64  ath, zShm);.#end
246d0 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  if.    pShmNode-
246e0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  >h = -1;.    pDb
246f0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
24700 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
24710 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
24720 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
24730 49 6e 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 73  Inode;.    if( s
24740 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
24750 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
24760 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
24770 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
24780 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
24790 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
247a0 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
247b0 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
247c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
247d0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
247e0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
247f0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
24800 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
24810 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
24820 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
24830 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
24840 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70  e3_uri_boolean(p
24850 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65  DbFd->zPath, "re
24860 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20  adonly_shm", 0) 
24870 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  ){.        pShmN
24880 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f  ode->h = robust_
24890 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 57  open(zShm, O_RDW
248a0 52 7c 4f 5f 43 52 45 41 54 2c 20 28 73 53 74 61  R|O_CREAT, (sSta
248b0 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29  t.st_mode&0777))
248c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
248d0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  if( pShmNode->h<
248e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  0 ){.        pSh
248f0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
24900 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52  t_open(zShm, O_R
24910 44 4f 4e 4c 59 2c 20 28 73 53 74 61 74 2e 73 74  DONLY, (sStat.st
24920 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20  _mode&0777));.  
24930 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
24940 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
24950 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
24960 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
24970 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
24980 65 6e 22 2c 20 7a 53 68 6d 29 3b 0a 20 20 20 20  en", zShm);.    
24990 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
249a0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 20  pen_err;.       
249b0 20 7d 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e   }.        pShmN
249c0 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
249d0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
249e0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
249f0 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e  rocess is runnin
24a00 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20  g as root, make 
24a10 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53 48  sure that the SH
24a20 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  M file.      ** 
24a30 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  is owned by the 
24a40 73 61 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f  same user that o
24a50 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  wns the original
24a60 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65   database.  Othe
24a70 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
24a80 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e  the original own
24a90 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  er will not be a
24aa0 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a  ble to connect..
24ab0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
24ac0 6f 62 75 73 74 46 63 68 6f 77 6e 28 70 53 68 6d  obustFchown(pShm
24ad0 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73  Node->h, sStat.s
24ae0 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f  t_uid, sStat.st_
24af0 67 69 64 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  gid);..      rc 
24b00 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64  = unixLockShared
24b10 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53  Memory(pDbFd, pS
24b20 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  hmNode);.      i
24b30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24b40 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52   && rc!=SQLITE_R
24b50 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54  EADONLY_CANTINIT
24b60 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e   ) goto shm_open
24b70 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _err;.    }.  }.
24b80 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
24b90 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
24ba0 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69  child of the uni
24bb0 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  xShmNode */.  p-
24bc0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
24bd0 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
24be0 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
24bf0 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
24c00 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
24c10 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
24c20 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
24c30 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c  Shm = p;.  unixL
24c40 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
24c50 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65  /* The reference
24c60 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f   count on pShmNo
24c70 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  de has already b
24c80 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  een incremented 
24c90 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  under.  ** the c
24ca0 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78  over of the unix
24cb0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74  EnterMutex() mut
24cc0 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74  ex and the point
24cd0 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  er from the.  **
24ce0 20 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e 69   new (struct uni
24cf0 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20  xShm) object to 
24d00 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73  the pShmNode has
24d10 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74   been set. All t
24d20 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74  hat is.  ** left
24d30 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e   to do is to lin
24d40 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  k the new object
24d50 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
24d60 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20   list starting. 
24d70 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d   ** at pShmNode-
24d80 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75  >pFirst. This mu
24d90 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65  st be done while
24da0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68   holding the pSh
24db0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20  mNode->mutex .  
24dc0 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20  ** mutex..  */. 
24dd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
24de0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
24df0 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  utex);.  p->pNex
24e00 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  t = pShmNode->pF
24e10 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  irst;.  pShmNode
24e20 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20  ->pFirst = p;.  
24e30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
24e40 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
24e50 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
24e60 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  c;..  /* Jump he
24e70 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
24e80 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
24e90 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
24ea0 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a  pDbFd);       /*
24eb0 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
24ec0 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
24ed0 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
24ee0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e  e3_free(p);.  un
24ef0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
24f00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24f10 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24f20 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
24f30 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
24f40 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
24f50 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
24f60 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
24f70 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
24f80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
24f90 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
24fa0 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
24fb0 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
24fc0 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
24fd0 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
24fe0 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
24ff0 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
25000 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
25010 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
25020 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
25030 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
25040 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
25050 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
25060 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65  se, if the bExte
25070 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
25080 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
25090 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
250a0 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
250b0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
250c0 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
250d0 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
250e0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
250f0 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
25100 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
25110 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
25120 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
25130 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65  ed. If .** bExte
25140 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  nd is non-zero a
25150 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
25160 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
25170 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
25180 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
25190 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
251a0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
251b0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
251c0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
251d0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
251e0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
251f0 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
25200 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
25210 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
25220 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
25230 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
25240 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
25250 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
25260 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
25270 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
25280 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
25290 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
252a0 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
252b0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
252c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
252d0 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
252e0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
252f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
25300 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
25310 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
25320 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25340 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
25350 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
25360 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
25370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
25380 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
25390 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20    int bExtend,  
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
253c0 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
253d0 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
253e0 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
253f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
25400 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
25410 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
25420 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
25430 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
25440 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68  Shm *p;.  unixSh
25450 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
25460 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25470 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68  TE_OK;.  int nSh
25480 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68  mPerMap = unixSh
25490 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b  mRegionPerMap();
254a0 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f  .  int nReqRegio
254b0 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  n;..  /* If the 
254c0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
254d0 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
254e0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
254f0 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66   it now. */.  if
25500 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
25510 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
25520 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
25530 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
25540 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25550 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
25560 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ..  p = pDbFd->p
25570 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  Shm;.  pShmNode 
25580 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
25590 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
255a0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
255b0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70 53 68  utex);.  if( pSh
255c0 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65  mNode->isUnlocke
255d0 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e  d ){.    rc = un
255e0 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f  ixLockSharedMemo
255f0 72 79 28 70 44 62 46 64 2c 20 70 53 68 6d 4e 6f  ry(pDbFd, pShmNo
25600 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
25610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
25620 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
25630 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55     pShmNode->isU
25640 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d  nlocked = 0;.  }
25650 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67  .  assert( szReg
25660 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73  ion==pShmNode->s
25670 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e  zRegion || pShmN
25680 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20  ode->nRegion==0 
25690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
256a0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
256b0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
256c0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
256d0 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46  de->h>=0 || pDbF
256e0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
256f0 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  essLock==1 );.  
25700 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
25710 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e  ->h<0 || pDbFd->
25720 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
25730 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Lock==0 );..  /*
25740 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Minimum number 
25750 6f 66 20 72 65 67 69 6f 6e 73 20 72 65 71 75 69  of regions requi
25760 72 65 64 20 74 6f 20 62 65 20 6d 61 70 70 65 64  red to be mapped
25770 2e 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69 6f  . */.  nReqRegio
25780 6e 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e 53  n = ((iRegion+nS
25790 68 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53 68 6d  hmPerMap) / nShm
257a0 50 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50 65  PerMap) * nShmPe
257b0 72 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70 53 68  rMap;..  if( pSh
257c0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e  mNode->nRegion<n
257d0 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  ReqRegion ){.   
257e0 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20   char **apNew;  
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25800 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67      /* New apReg
25810 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ion[] array */. 
25820 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
25830 52 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  ReqRegion*szRegi
25840 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  on;   /* Minimum
25850 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   required file s
25860 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ize */.    struc
25870 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25890 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29   Used by fstat()
258a0 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
258b0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
258c0 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28  Region;..    if(
258d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
258e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
258f0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
25900 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
25910 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
25920 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
25930 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b  ..      ** Check
25940 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
25950 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
25960 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
25970 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
25980 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65        ** large e
25990 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
259a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
259b0 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f  egion)..      */
259c0 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
259d0 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  at(pShmNode->h, 
259e0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
259f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
25a00 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20  OERR_SHMSIZE;.  
25a10 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
25a20 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
25a30 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74    .      if( sSt
25a40 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65  at.st_size<nByte
25a50 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
25a60 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
25a70 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
25a80 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45  not exist. If bE
25a90 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a  xtend is set to.
25aa0 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65          ** false
25ab0 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
25ac0 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
25ad0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
25ae0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
25af0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25b00 20 69 66 28 20 21 62 45 78 74 65 6e 64 20 29 7b   if( !bExtend ){
25b10 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
25b20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
25b30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
25b40 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79  /* Alternatively
25b50 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20  , if bExtend is 
25b60 74 72 75 65 2c 20 65 78 74 65 6e 64 20 74 68 65  true, extend the
25b70 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62   file. Do this b
25b80 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69  y.        ** wri
25b90 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79  ting a single by
25ba0 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  te to the end of
25bb0 20 65 61 63 68 20 28 4f 53 29 20 70 61 67 65 20   each (OS) page 
25bc0 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  being.        **
25bd0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78   allocated or ex
25be0 74 65 6e 64 65 64 2e 20 54 65 63 68 6e 69 63 61  tended. Technica
25bf0 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c  lly, we need onl
25c00 79 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20  y write to the. 
25c10 20 20 20 20 20 20 20 2a 2a 20 6c 61 73 74 20 70         ** last p
25c20 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  age in order to 
25c30 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e  extend the file.
25c40 20 42 75 74 20 77 72 69 74 69 6e 67 20 74 6f 20   But writing to 
25c50 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20 20 20  all new.        
25c60 2a 2a 20 70 61 67 65 73 20 66 6f 72 63 65 73 20  ** pages forces 
25c70 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61  the OS to alloca
25c80 74 65 20 74 68 65 6d 20 69 6d 6d 65 64 69 61 74  te them immediat
25c90 65 6c 79 2c 20 77 68 69 63 68 20 72 65 64 75 63  ely, which reduc
25ca0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  es.        ** th
25cb0 65 20 63 68 61 6e 63 65 73 20 6f 66 20 53 49 47  e chances of SIG
25cc0 42 55 53 20 77 68 69 6c 65 20 61 63 63 65 73 73  BUS while access
25cd0 69 6e 67 20 74 68 65 20 6d 61 70 70 65 64 20 72  ing the mapped r
25ce0 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a  egion later on..
25cf0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25d00 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20     else{.       
25d10 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
25d20 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b  int pgsz = 4096;
25d30 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
25d40 50 67 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  Pg;..          /
25d50 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 6c  * Write to the l
25d60 61 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68  ast byte of each
25d70 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
25d80 20 6f 72 20 65 78 74 65 6e 64 65 64 20 70 61 67   or extended pag
25d90 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  e */.          a
25da0 73 73 65 72 74 28 20 28 6e 42 79 74 65 20 25 20  ssert( (nByte % 
25db0 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20  pgsz)==0 );.    
25dc0 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 28 73        for(iPg=(s
25dd0 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73  Stat.st_size/pgs
25de0 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f 70  z); iPg<(nByte/p
25df0 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  gsz); iPg++){.  
25e00 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20            int x 
25e10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
25e20 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74   if( seekAndWrit
25e30 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  eFd(pShmNode->h,
25e40 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a   iPg*pgsz + pgsz
25e50 2d 31 2c 20 22 22 2c 20 31 2c 20 26 78 29 21 3d  -1, "", 1, &x)!=
25e60 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
25e70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
25e80 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  File = pShmNode-
25e90 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20  >zFilename;.    
25ea0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
25eb0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
25ec0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
25ed0 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65  , "write", zFile
25ee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
25ef0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
25f00 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
25f10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25f30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
25f40 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
25f50 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
25f60 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
25f70 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
25f80 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
25f90 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  char **)sqlite3_
25fa0 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
25fb0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
25fc0 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a  ion, nReqRegion*
25fd0 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20  sizeof(char *). 
25fe0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
25ff0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
26000 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
26010 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
26020 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
26030 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
26040 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
26050 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68   = apNew;.    wh
26060 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ile( pShmNode->n
26070 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f  Region<nReqRegio
26080 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n ){.      int n
26090 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e  Map = szRegion*n
260a0 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 20  ShmPerMap;.     
260b0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 76 6f   int i;.      vo
260c0 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20  id *pMem;.      
260d0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
260e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =0 ){.        pM
260f0 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e  em = osMmap(0, n
26100 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Map,.           
26110 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
26120 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41  donly ? PROT_REA
26130 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52  D : PROT_READ|PR
26140 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20  OT_WRITE, .     
26150 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45         MAP_SHARE
26160 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  D, pShmNode->h, 
26170 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53  szRegion*(i64)pS
26180 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a  hmNode->nRegion.
26190 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
261a0 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50     if( pMem==MAP
261b0 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
261c0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
261d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
261e0 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61  ERR_SHMMAP, "mma
261f0 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  p", pShmNode->zF
26200 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
26210 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
26220 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
26230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26240 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69       pMem = sqli
26250 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52  te3_malloc64(szR
26260 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  egion);.        
26270 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20  if( pMem==0 ){. 
26280 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26290 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
262a0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
262b0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
262c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
262d0 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73  emset(pMem, 0, s
262e0 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
262f0 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  }..      for(i=0
26300 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b 20  ; i<nShmPerMap; 
26310 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i++){.        pS
26320 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
26330 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
26340 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61 72 2a  on+i] = &((char*
26350 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a  )pMem)[szRegion*
26360 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
26370 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
26380 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d 61  ion += nShmPerMa
26390 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68  p;.    }.  }..sh
263a0 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  mpage_out:.  if(
263b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
263c0 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  on>iRegion ){.  
263d0 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65    *pp = pShmNode
263e0 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69  ->apRegion[iRegi
263f0 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  on];.  }else{.  
26400 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
26410 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   if( pShmNode->i
26420 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d  sReadonly && rc=
26430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
26440 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
26450 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  Y;.  sqlite3_mut
26460 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
26470 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
26480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26490 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
264a0 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
264b0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
264c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  nt..**.** Note t
264d0 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  hat the relation
264e0 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41  ship between SHA
264f0 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56  REd and EXCLUSIV
26500 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74  E locks is a lit
26510 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  tle.** different
26520 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f   here than in po
26530 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63  six.  In xShmLoc
26540 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20  k(), one can go 
26550 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a  from unlocked.**
26560 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62   to shared and b
26570 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f  ack or from unlo
26580 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  cked to exclusiv
26590 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74  e and back.  But
265a0 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20   one may.** not 
265b0 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74  go from shared t
265c0 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66  o exclusive or f
265d0 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f  rom exclusive to
265e0 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74   shared..*/.stat
265f0 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f  ic int unixShmLo
26600 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
26610 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
26620 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
26630 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
26640 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
26650 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
26660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26670 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
26680 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
26690 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
266a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
266c0 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
266d0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
266e0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
266f0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
26700 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
26710 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  lock */.){.  uni
26720 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
26730 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20  unixFile*)fd;   
26740 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
26750 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
26760 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78  memory */.  unix
26770 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
26780 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
26790 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
267a0 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
267b0 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ked */.  unixShm
267c0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
267d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
267e0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
267f0 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
26800 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
26810 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
26820 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68  pShmNode;  /* Th
26830 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c  e underlying fil
26840 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  e iNode */.  int
26850 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26870 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
26880 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
268b0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
268c0 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
268d0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
268e0 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
268f0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
26900 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
26910 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
26920 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
26930 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
26940 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
26950 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
26960 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
26970 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
26980 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
26990 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
269a0 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
269b0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
269c0 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
269d0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
269e0 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
269f0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
26a00 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
26a10 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
26a20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
26a30 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
26a40 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
26a50 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
26a60 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
26a70 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
26a80 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
26a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
26aa0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
26ab0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
26ac0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
26ad0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
26ae0 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
26af0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
26b00 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
26b10 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66    mask = (1<<(of
26b20 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
26b30 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  t);.  assert( n>
26b40 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
26b50 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
26b60 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
26b70 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
26b80 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
26b90 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
26ba0 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
26bb0 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
26bc0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
26bd0 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
26be0 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
26bf0 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
26c00 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
26c10 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
26c20 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
26c30 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
26c40 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
26c50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
26c60 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
26c70 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
26c80 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
26c90 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
26ca0 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
26cb0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
26cc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
26cd0 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
26ce0 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
26cf0 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
26d00 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
26d10 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
26d20 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
26d30 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_UNLCK, ofst+UN
26d40 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
26d50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26d60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
26d70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
26d80 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
26d90 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
26da0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26db0 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
26dc0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
26dd0 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
26de0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
26df0 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
26e00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
26e10 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
26e20 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
26e30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
26e40 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
26e50 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
26e60 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
26e70 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
26e80 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
26e90 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
26ea0 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
26eb0 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
26ec0 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
26ed0 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
26ee0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
26ef0 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
26f00 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
26f10 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
26f20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
26f30 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
26f40 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
26f50 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
26f60 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
26f70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
26f80 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
26f90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26fa0 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
26fb0 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
26fc0 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
26fd0 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
26fe0 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
26ff0 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
27000 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
27010 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27020 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
27030 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
27040 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
27050 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
27060 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f  emLock(pDbFd, F_
27070 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  RDLCK, ofst+UNIX
27080 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
27090 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
270a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
270b0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
270c0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
270d0 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c  e local shared l
270e0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
270f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27100 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
27110 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
27120 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
27130 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
27140 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
27150 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
27160 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
27170 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  this.    ** lock
27180 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65  .  If any do, re
27190 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
271a0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
271b0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
271c0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
271d0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
271e0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
271f0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
27200 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73  sk)!=0 || (pX->s
27210 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
27220 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
27230 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
27240 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
27250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27260 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65   .    /* Get the
27270 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
27280 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
27290 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
272a0 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
272b0 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
272c0 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
272d0 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
272e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
272f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27300 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
27310 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
27320 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66  bFd, F_WRLCK, of
27330 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
27340 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
27350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27360 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27370 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
27380 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
27390 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
273a0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
273b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
273c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
273d0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
273e0 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
273f0 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
27400 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25  %d, pid-%d got %
27410 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
27420 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 6f          p->id, o
27430 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d 3e 73  sGetpid(0), p->s
27440 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
27450 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75  clMask));.  retu
27460 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27470 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
27480 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
27490 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
274a0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
274b0 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
274c0 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
274d0 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
274e0 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
274f0 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
27500 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
27510 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
27520 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
27530 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72  void unixShmBarr
27540 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
27550 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
27560 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
27570 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
27580 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
27590 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  y */.){.  UNUSED
275a0 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
275b0 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42    sqlite3MemoryB
275c0 61 72 72 69 65 72 28 29 3b 20 20 20 20 20 20 20  arrier();       
275d0 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64 65    /* compiler-de
275e0 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61 72  fined memory bar
275f0 72 69 65 72 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  rier */.  unixEn
27600 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20 20  terMutex();     
27610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73            /* Als
27620 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72 65 64  o mutex, for red
27630 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75 6e 69  undancy */.  uni
27640 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
27650 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
27660 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
27670 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
27680 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
27690 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
276a0 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
276b0 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
276c0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72  there is no shar
276d0 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
276e0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  ated with the co
276f0 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68  nnection then th
27700 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
27710 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
27720 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
27730 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20   unixShmUnmap(. 
27740 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
27750 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
27760 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
27770 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
27780 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
27790 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
277a0 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
277b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66  shared-memory if
277c0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
277d0 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  ixShm *p;       
277e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
277f0 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
27800 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
27810 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
27820 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20  ShmNode;        
27830 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
27840 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
27850 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  y file */.  unix
27860 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20  Shm **pp;       
27870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27880 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
27890 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
278a0 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ons */.  unixFil
278b0 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
278c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
278d0 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
278e0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70  ase file */..  p
278f0 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
27900 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46  *)fd;.  p = pDbF
27910 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70  d->pShm;.  if( p
27920 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
27930 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f  ITE_OK;.  pShmNo
27940 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
27950 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  ;..  assert( pSh
27960 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  mNode==pDbFd->pI
27970 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29  node->pShmNode )
27980 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
27990 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
279a0 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a  bFd->pInode );..
279b0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
279c0 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
279d0 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
279e0 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
279f0 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
27a00 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
27a10 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
27a20 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
27a30 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
27a40 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
27a50 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
27a60 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
27a70 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
27a80 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
27a90 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
27aa0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
27ab0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
27ac0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
27ad0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
27ae0 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
27af0 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
27b00 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
27b10 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
27b20 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
27b30 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
27b40 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78  e, too */.  unix
27b50 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
27b60 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
27b70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
27b80 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
27b90 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
27ba0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nRef==0 ){.    i
27bb0 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26  f( deleteFlag &&
27bc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
27bd0 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
27be0 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  k(pShmNode->zFil
27bf0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
27c00 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
27c10 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  DbFd);.  }.  uni
27c20 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
27c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27c40 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20  OK;.}...#else.# 
27c50 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61  define unixShmMa
27c60 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
27c70 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20   unixShmLock    
27c80 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
27c90 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
27ca0 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61  fine unixShmUnma
27cb0 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
27cc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27cd0 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20  MIT_WAL */..#if 
27ce0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
27cf0 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20  SIZE>0./*.** If 
27d00 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
27d10 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 75  memory mapped, u
27d20 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a  nmap file pFd..*
27d30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
27d40 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
27d50 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73  File *pFd){.  as
27d60 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
27d70 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28  hOut==0 );.  if(
27d80 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
27d90 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70   ){.    osMunmap
27da0 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  (pFd->pMapRegion
27db0 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  , pFd->mmapSizeA
27dc0 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d  ctual);.    pFd-
27dd0 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
27de0 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
27df0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d  ze = 0;.    pFd-
27e00 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
27e10 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
27e20 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
27e30 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
27e40 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
27e50 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69  maintained by fi
27e60 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  le .** descripto
27e70 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79  r pFd to nNew by
27e80 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e  tes. Any existin
27e90 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73  g mapping is dis
27ea0 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  carded..**.** If
27eb0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
27ec0 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
27ed0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
27ee0 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  riables:.**.**  
27ef0 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d       unixFile.pM
27f00 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20  apRegion.**     
27f10 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
27f20 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69  ize.**       uni
27f30 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63  xFile.mmapSizeAc
27f40 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e  tual.**.** If un
27f50 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65  successful, an e
27f60 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
27f70 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69 74  logged via sqlit
27f80 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20  e3_log() and.** 
27f90 74 68 65 20 74 68 72 65 65 20 76 61 72 69 61 62  the three variab
27fa0 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65  les above are ze
27fb0 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  roed. In this ca
27fc0 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  se SQLite should
27fd0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63  .** continue acc
27fe0 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62  essing the datab
27ff0 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 78 52  ase using the xR
28000 65 61 64 28 29 20 61 6e 64 20 78 57 72 69 74 65  ead() and xWrite
28010 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a  ().** methods..*
28020 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
28030 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75  ixRemapfile(.  u
28040 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20  nixFile *pFd,   
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28060 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
28070 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  r object */.  i6
28080 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20  4 nNew          
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
280a0 20 52 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e   Required mappin
280b0 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63  g size */.){.  c
280c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
280d0 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20  = "mmap";.  int 
280e0 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20  h = pFd->h;     
280f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28100 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
28110 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66  tor open on db f
28120 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72  ile */.  u8 *pOr
28130 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e  ig = (u8 *)pFd->
28140 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a  pMapRegion;   /*
28150 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
28160 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  ent file mapping
28170 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20   */.  i64 nOrig 
28180 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  = pFd->mmapSizeA
28190 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69  ctual;     /* Si
281a0 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69  ze of pOrig regi
281b0 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  on in bytes */. 
281c0 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20   u8 *pNew = 0;  
281d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281e0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
281f0 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67  n of new mapping
28200 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
28210 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20  = PROT_READ;    
28220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
28230 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d  ags to pass to m
28240 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65  map() */..  asse
28250 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
28260 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ut==0 );.  asser
28270 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61  t( nNew>pFd->mma
28280 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  pSize );.  asser
28290 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d  t( nNew<=pFd->mm
282a0 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61  apSizeMax );.  a
282b0 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
282c0 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
282d0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d  mmapSizeActual>=
282e0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b  pFd->mmapSize );
282f0 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46  .  assert( MAP_F
28300 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69 66  AILED!=0 );..#if
28310 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f  def SQLITE_MMAP_
28320 52 45 41 44 57 52 49 54 45 0a 20 20 69 66 28 20  READWRITE.  if( 
28330 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
28340 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
28350 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d  Y)==0 ) flags |=
28360 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65 6e   PROT_WRITE;.#en
28370 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 72 69 67  dif..  if( pOrig
28380 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45   ){.#if HAVE_MRE
28390 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75  MAP.    i64 nReu
283a0 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  se = pFd->mmapSi
283b0 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f  ze;.#else.    co
283c0 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67  nst int szSyspag
283d0 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a  e = osGetpagesiz
283e0 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65  e();.    i64 nRe
283f0 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70  use = (pFd->mmap
28400 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61  Size & ~(szSyspa
28410 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20  ge-1));.#endif. 
28420 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70     u8 *pReq = &p
28430 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20  Orig[nReuse];.. 
28440 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20     /* Unmap any 
28450 70 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69  pages of the exi
28460 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68  sting mapping th
28470 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75  at cannot be reu
28480 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  sed. */.    if( 
28490 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b  nReuse!=nOrig ){
284a0 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
284b0 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75  pReq, nOrig-nReu
284c0 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
284d0 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20  HAVE_MREMAP.    
284e0 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28  pNew = osMremap(
284f0 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e  pOrig, nReuse, n
28500 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d  New, MREMAP_MAYM
28510 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d  OVE);.    zErr =
28520 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65   "mremap";.#else
28530 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d  .    pNew = osMm
28540 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52  ap(pReq, nNew-nR
28550 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50  euse, flags, MAP
28560 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75  _SHARED, h, nReu
28570 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  se);.    if( pNe
28580 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w!=MAP_FAILED ){
28590 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21  .      if( pNew!
285a0 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20  =pReq ){.       
285b0 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20   osMunmap(pNew, 
285c0 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a  nNew - nReuse);.
285d0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30          pNew = 0
285e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
285f0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f         pNew = pO
28600 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rig;.      }.   
28610 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
28620 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f  * The attempt to
28630 20 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73   extend the exis
28640 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69  ting mapping fai
28650 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f  led. Free it. */
28660 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  .    if( pNew==M
28670 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65  AP_FAILED || pNe
28680 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  w==0 ){.      os
28690 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52  Munmap(pOrig, nR
286a0 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  euse);.    }.  }
286b0 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69  ..  /* If pNew i
286c0 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72  s still NULL, tr
286d0 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65  y to create an e
286e0 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70  ntirely new mapp
286f0 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e  ing. */.  if( pN
28700 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ew==0 ){.    pNe
28710 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e  w = osMmap(0, nN
28720 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  ew, flags, MAP_S
28730 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20  HARED, h, 0);.  
28740 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  }..  if( pNew==M
28750 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
28760 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e   pNew = 0;.    n
28770 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69  New = 0;.    uni
28780 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
28790 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e  _OK, zErr, pFd->
287a0 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20  zPath);..    /* 
287b0 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62  If the mmap() ab
287c0 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75  ove failed, assu
287d0 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73  me that all subs
287e0 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61  equent mmap() ca
287f0 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  lls.    ** will 
28800 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f  probably fail to
28810 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20  o. Fall back to 
28820 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69  using xRead/xWri
28830 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20  te exclusively. 
28840 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
28850 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d  se.  */.    pFd-
28860 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30  >mmapSizeMax = 0
28870 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61  ;.  }.  pFd->pMa
28880 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20  pRegion = (void 
28890 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d  *)pNew;.  pFd->m
288a0 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d  mapSize = pFd->m
288b0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
288c0 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  nNew;.}../*.** M
288d0 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d  emory map or rem
288e0 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  ap the file open
288f0 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72  ed by file-descr
28900 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68  iptor pFd (if th
28910 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72  e file.** is alr
28920 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65  eady mapped, the
28930 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
28940 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  g is replaced by
28950 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69   the new). Or, i
28960 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65  f .** there alre
28970 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70  ady exists a map
28980 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69  ping for this fi
28990 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
289a0 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73  e still .** outs
289b0 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29  tanding xFetch()
289c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69   references to i
289d0 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
289e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
289f0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
28a00 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  nByte is non-neg
28a10 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
28a20 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
28a30 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  size of .** the 
28a40 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74  mapping to creat
28a50 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
28a60 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74   nByte is less t
28a70 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
28a80 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
28a90 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a   size is the siz
28aa0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
28ab0 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61   disk. The actua
28ac0 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  l size of the.**
28ad0 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67   created mapping
28ae0 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72   is either the r
28af0 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72  equested size or
28b00 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69   the value confi
28b10 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20  gured .** using 
28b20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
28b30 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76  P_LIMIT, whichev
28b40 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
28b50 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
28b60 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
28b70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
28b80 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
28b90 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
28ba0 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
28bb0 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
28bc0 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
28bd0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
28be0 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
28bf0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
28c00 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e  t unixMapfile(un
28c10 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34  ixFile *pFd, i64
28c20 20 6e 4d 61 70 29 7b 0a 20 20 61 73 73 65 72 74   nMap){.  assert
28c30 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64  ( nMap>=0 || pFd
28c40 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
28c50 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  ;.  assert( nMap
28c60 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70  >0 || (pFd->mmap
28c70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e  Size==0 && pFd->
28c80 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29  pMapRegion==0) )
28c90 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65  ;.  if( pFd->nFe
28ca0 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72  tchOut>0 ) retur
28cb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
28cc0 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20  if( nMap<0 ){.  
28cd0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
28ce0 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
28cf0 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
28d00 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
28d10 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
28d20 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75  (pFd->h, &statbu
28d30 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
28d40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
28d50 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20  FSTAT;.    }.   
28d60 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e   nMap = statbuf.
28d70 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  st_size;.  }.  i
28d80 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61  f( nMap>pFd->mma
28d90 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20  pSizeMax ){.    
28da0 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  nMap = pFd->mmap
28db0 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20  SizeMax;.  }..  
28dc0 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c  assert( nMap>0 |
28dd0 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  | (pFd->mmapSize
28de0 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70  ==0 && pFd->pMap
28df0 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20  Region==0) );.  
28e00 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d  if( nMap!=pFd->m
28e10 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 75  mapSize ){.    u
28e20 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64  nixRemapfile(pFd
28e30 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20  , nMap);.  }..  
28e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28e50 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
28e60 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
28e70 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ZE>0 */../*.** I
28e80 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75  f possible, retu
28e90 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
28ea0 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c  a mapping of fil
28eb0 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74  e fd starting at
28ec0 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e   offset.** iOff.
28ed0 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73   The mapping mus
28ee0 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61  t be valid for a
28ef0 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74  t least nAmt byt
28f00 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  es..**.** If suc
28f10 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20  h a pointer can 
28f20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f  be obtained, sto
28f30 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64  re it in *pp and
28f40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28f50 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65  K..** Or, if one
28f60 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65   cannot but no e
28f70 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
28f80 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65   *pp to 0 and re
28f90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
28fa0 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61  ** Finally, if a
28fb0 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
28fc0 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  ur, return an SQ
28fd0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
28fe0 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61   The final.** va
28ff0 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e  lue of *pp is un
29000 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
29010 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
29020 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
29030 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
29040 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  er, the caller m
29050 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  ust eventually .
29060 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
29070 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
29080 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28  ing unixUnfetch(
29090 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
290a0 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74   unixFetch(sqlit
290b0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
290c0 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
290d0 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
290e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
290f0 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
29100 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
29110 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
29120 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
29130 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
29140 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
29150 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
29160 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
29170 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
29180 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
29190 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
291a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
291b0 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
291c0 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
291d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
291e0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
291f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29200 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
29210 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
29220 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
29230 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
29240 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
29250 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
29260 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
29270 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
29280 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
29290 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
292a0 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
292b0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
292c0 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20  tion releases a 
292d0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62  .** reference ob
292e0 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72  tained by an ear
292f0 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69  lier call to uni
29300 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65  xFetch(). The se
29310 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
29320 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
29330 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
29340 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
29350 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
29360 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  * argument that 
29370 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
29380 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e  e unixFetch() in
29390 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
293a0 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
293b0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
293c0 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
293d0 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
293e0 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
293f0 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
29400 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
29410 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
29420 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
29430 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
29440 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
29450 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
29460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
29470 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74  nixUnfetch(sqlit
29480 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
29490 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
294a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
294b0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
294c0 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
294d0 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
294e0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
294f0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
29500 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
29510 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20  METER(iOff);..  
29520 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
29530 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
29540 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
29550 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
29560 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63  ding .  ** xFetc
29570 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72  h references. Or
29580 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69  , if p!=0 (meani
29590 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74  ng it is an xFet
295a0 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20  ch reference),. 
295b0 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d   ** then there m
295c0 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
295d0 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e  one outstanding.
295e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
295f0 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65  p==0)==(pFd->nFe
29600 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20  tchOut==0) );.. 
29610 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20   /* If p!=0, it 
29620 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69  must match the i
29630 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  Off value. */.  
29640 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
29650 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e  p==&((u8 *)pFd->
29660 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
29670 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  ] );..  if( p ){
29680 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
29690 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
296a0 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
296b0 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
296c0 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
296d0 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73  chOut>=0 );.#els
296e0 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
296f0 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
29700 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
29710 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29720 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69  TER(iOff);.#endi
29730 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
29740 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
29750 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
29760 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
29770 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
29780 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
29790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297a0 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
297b0 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
297c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
297e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
29830 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
29840 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
29850 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
29860 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
29870 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
29880 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
29890 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
298a0 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
298b0 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
298c0 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
298d0 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
298e0 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
298f0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
29900 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
29910 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
29920 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29930 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
29940 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
29950 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
29960 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
29970 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
29980 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
29990 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
299a0 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
299b0 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
299c0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
299d0 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
299e0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
299f0 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
29a00 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
29a10 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29a20 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
29a30 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
29a40 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
29a50 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
29a60 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
29a70 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
29a80 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
29a90 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
29aa0 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
29ab0 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
29ac0 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
29ad0 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  r finder-functio
29ae0 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
29af0 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
29b00 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
29b10 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
29b20 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
29b30 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
29b40 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
29b50 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
29b60 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
29b70 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
29b80 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
29b90 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
29ba0 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
29bb0 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
29bc0 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
29bd0 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
29be0 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
29bf0 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
29c00 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
29c10 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
29c20 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
29c30 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
29c40 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
29c50 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
29c60 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
29c70 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
29c80 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
29c90 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
29ca0 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
29cb0 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
29cc0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29cd0 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
29ce0 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
29cf0 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
29d00 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
29d10 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
29d20 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
29d30 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
29d40 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
29d50 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
29d60 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
29d70 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
29d80 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
29d90 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
29da0 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
29db0 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
29dc0 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52  INDER,METHOD,VER
29dd0 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c  SION,CLOSE,LOCK,
29de0 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48  UNLOCK,CKLOCK,SH
29df0 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61 74  MMAP)     \.stat
29e00 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
29e10 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
29e20 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e40 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
29e50 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
29e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
29e70 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
29e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e90 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
29ea0 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
29eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29ec0 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
29ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ee0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
29ef0 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
29f00 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
29f10 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f30 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
29f40 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
29f50 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
29f60 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f80 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
29f90 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
29fa0 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
29fb0 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
29fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fd0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
29fe0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
29ff0 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
2a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a020 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
2a030 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
2a040 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
2a050 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a070 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a090 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0c0 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
2a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0e0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
2a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a110 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a130 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2a140 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
2a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2a160 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
2a170 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
2a180 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
2a190 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2a1b0 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
2a1c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
2a1d0 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
2a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2a200 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
2a210 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
2a220 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
2a230 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
2a240 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2a250 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20   SHMMAP,        
2a260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a270 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20  xShmMap */      
2a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a290 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2a2a0 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  unixShmLock,    
2a2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a2c0 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2a2f0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20  nixShmBarrier,  
2a300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2a310 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20  hmBarrier */    
2a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a330 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2a340 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  ixShmUnmap,     
2a350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2a360 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  mUnmap */       
2a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a380 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2a390 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  xFetch,         
2a3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
2a3b0 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3d0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2a3e0 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20  Unfetch,        
2a3f0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
2a400 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
2a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a420 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20        \.};      
2a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a470 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
2a480 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2a490 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23  ethods *FINDER##
2a4a0 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  Impl(const char 
2a4b0 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29  *z, unixFile *p)
2a4c0 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50  {   \.  UNUSED_P
2a4d0 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55  ARAMETER(z); UNU
2a4e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
2a4f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a510 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d     \.  return &M
2a520 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20  ETHOD;          
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a560 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20    \.}           
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5b0 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
2a5c0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2a5d0 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44  ds *(*const FIND
2a5e0 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ER)(const char*,
2a5f0 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20  unixFile *p)    
2a600 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23  \.    = FINDER##
2a610 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  Impl;../*.** Her
2a620 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65  e are all of the
2a630 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a640 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ods objects for 
2a650 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  each of the.** l
2a660 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
2a670 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68  s.  Functions th
2a680 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  at return pointe
2a690 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68  rs to these meth
2a6a0 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ods.** are also 
2a6b0 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45  created..*/.IOME
2a6c0 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f  THODS(.  posixIo
2a6d0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2a6e0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2a6f0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2a700 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20  posixIoMethods, 
2a710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2a720 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a730 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2a740 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
2a750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2a760 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20  ared memory and 
2a770 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64  mmap are enabled
2a780 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
2a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7a0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2a7b0 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7d0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2a7e0 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a800 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2a810 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
2a820 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
2a830 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2a840 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2a850 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20    unixShmMap    
2a860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a870 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2a880 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
2a890 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  nolockIoFinder, 
2a8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2a8b0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2a8c0 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d  e */.  nolockIoM
2a8d0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2a8e0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2a8f0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2a900 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20  me */.  3,      
2a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a920 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2a930 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2a940 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c  /.  nolockClose,
2a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a960 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2a970 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20  /.  nolockLock, 
2a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a990 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2a9a0 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  .  nolockUnlock,
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a9c0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2a9d0 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  /.  nolockCheckR
2a9e0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a  eservedLock,  /*
2a9f0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2aa00 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2aa10 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2aa20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2aa30 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2aa40 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f  .IOMETHODS(.  do
2aa50 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  tlockIoFinder,  
2aa60 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2aa70 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2aa80 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65  */.  dotlockIoMe
2aa90 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f  thods,         /
2aaa0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2aab0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2aac0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aae0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2aaf0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2ab00 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20    dotlockClose, 
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ab20 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2ab30 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20    dotlockLock,  
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ab50 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2ab60 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20   dotlockUnlock, 
2ab70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2ab80 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2ab90 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65    dotlockCheckRe
2aba0 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78  servedLock, /* x
2abb0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2abc0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abe0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2abf0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a  ap method */.)..
2ac00 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2ac10 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2ac20 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f  IOMETHODS(.  flo
2ac30 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
2ac40 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2ac50 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2ac60 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f  /.  flockIoMetho
2ac70 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
2ac80 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2ac90 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2aca0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2acc0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2acd0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
2ace0 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20   flockClose,    
2acf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2ad00 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2ad10 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20   flockLock,     
2ad20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2ad30 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2ad40 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  flockUnlock,    
2ad50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2ad60 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2ad70 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
2ad80 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43  vedLock,   /* xC
2ad90 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2ada0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adc0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
2add0 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
2ade0 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ndif..#if OS_VXW
2adf0 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
2ae00 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20    semIoFinder,  
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ae20 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2ae30 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65  ame */.  semIoMe
2ae40 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2ae50 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2ae60 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2ae70 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae90 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2aea0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2aeb0 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c   */.  semXClose,
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aed0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2aee0 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20   */.  semXLock, 
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af00 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2af10 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c  */.  semXUnlock,
2af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2af30 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2af40 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52   */.  semXCheckR
2af50 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
2af60 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2af70 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2af80 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2af90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2afa0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2afb0 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .).#endif..#if d
2afc0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2afd0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2afe0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2aff0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66  .IOMETHODS(.  af
2b000 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  pIoFinder,      
2b010 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2b020 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2b030 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64  */.  afpIoMethod
2b040 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
2b050 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2b060 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2b070 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b090 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2b0a0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2b0b0 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20    afpClose,     
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b0d0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2b0e0 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20    afpLock,      
2b0f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b100 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2b110 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   afpUnlock,     
2b120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2b130 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2b140 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76    afpCheckReserv
2b150 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78  edLock,     /* x
2b160 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b170 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b190 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2b1a0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
2b1b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
2b1c0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
2b1d0 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
2b1e0 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
2b1f0 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
2b200 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
2b210 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
2b220 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
2b230 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
2b240 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
2b250 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
2b260 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
2b270 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
2b280 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
2b290 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
2b2a0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
2b2b0 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
2b2c0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
2b2d0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
2b2e0 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
2b2f0 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
2b300 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
2b310 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
2b320 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
2b330 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
2b340 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
2b350 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
2b360 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
2b370 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
2b380 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
2b390 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
2b3a0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2b3b0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2b3c0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2b3d0 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
2b3e0 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
2b3f0 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
2b400 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
2b410 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
2b420 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
2b430 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
2b440 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
2b450 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
2b460 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
2b470 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
2b480 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
2b490 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
2b4a0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2b4b0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2b4c0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
2b4d0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
2b4e0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2b4f0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2b500 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
2b510 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b520 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2b530 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2b540 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
2b550 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2b560 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2b570 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
2b580 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2b590 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2b5a0 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
2b5b0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2b5c0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2b5d0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
2b5e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b5f0 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k,   /* xCheckRe
2b600 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2b610 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b630 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2b640 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2b650 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
2b660 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
2b670 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
2b680 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
2b690 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
2b6a0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2b6b0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2b6c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2b6d0 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
2b6e0 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b700 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2b710 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
2b720 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2b730 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2b740 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2b750 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b770 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2b780 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2b790 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
2b7a0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2b7b0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
2b7c0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
2b7d0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2b7e0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2b7f0 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c  thod */.  nfsUnl
2b800 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2b810 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
2b820 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2b830 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b840 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
2b850 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2b860 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b880 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
2b890 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
2b8a0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
2b8b0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2b8c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b8d0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
2b8e0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
2b8f0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
2b900 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2b910 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
2b920 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
2b930 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b940 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
2b950 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
2b960 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
2b970 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
2b980 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
2b990 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
2b9a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
2b9b0 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
2b9c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2b9d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2b9e0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
2b9f0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
2ba00 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
2ba10 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
2ba20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2ba30 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
2ba40 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
2ba50 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
2ba60 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2ba70 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
2ba80 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2ba90 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
2baa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2bab0 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
2bac0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
2bad0 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
2bae0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
2baf0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2bb00 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
2bb10 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
2bb20 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
2bb30 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
2bb40 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
2bb50 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
2bb60 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
2bb70 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
2bb80 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
2bb90 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
2bba0 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
2bbb0 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
2bbc0 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
2bbd0 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
2bbe0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
2bbf0 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
2bc00 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
2bc10 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
2bc20 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
2bc30 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
2bc40 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
2bc50 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
2bc60 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
2bc70 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2bc80 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
2bc90 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
2bca0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
2bcb0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
2bcc0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2bcd0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
2bce0 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
2bcf0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
2bd00 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
2bd10 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
2bd20 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
2bd30 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
2bd40 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
2bd50 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
2bd60 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
2bd70 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
2bd80 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2bd90 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2bda0 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
2bdb0 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
2bdc0 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
2bdd0 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
2bde0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2bdf0 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
2be00 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
2be10 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
2be20 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
2be30 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
2be40 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
2be50 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
2be60 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
2be70 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
2be80 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
2be90 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
2bea0 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
2beb0 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
2bec0 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
2bed0 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
2bee0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
2bef0 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
2bf00 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
2bf10 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
2bf20 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
2bf30 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
2bf40 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
2bf50 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2bf60 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
2bf70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2bf80 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
2bf90 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2bfa0 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
2bfb0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2bfc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2bfd0 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
2bfe0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
2bff0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2c000 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
2c010 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
2c020 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
2c030 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2c040 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
2c050 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
2c060 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
2c070 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2c080 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2c090 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
2c0a0 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a  OS_VXWORKS./*.**
2c0b0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
2c0c0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f  unction for VxWo
2c0d0 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65  rks checks to se
2c0e0 65 20 69 66 20 70 6f 73 69 78 20 61 64 76 69 73  e if posix advis
2c0f0 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77  ory.** locking w
2c100 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65  orks.  If it doe
2c110 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 20  s, then that is 
2c120 77 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 49  what is used.  I
2c130 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  f it does not.**
2c140 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c   work, then fall
2c150 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65  back to named se
2c160 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e  maphore locking.
2c170 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2c180 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2c190 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69  ods *vxworksIoFi
2c1a0 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
2c1b0 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
2c1c0 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
2c1d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c1e0 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
2c1f0 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
2c200 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  /* the open file
2c210 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
2c220 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
2c230 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
2c240 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
2c250 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
2c260 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
2c270 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
2c280 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
2c290 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
2c2a0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
2c2b0 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
2c2c0 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
2c2d0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
2c2e0 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63  .  /* Test if fc
2c2f0 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74  ntl() is support
2c300 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58  ed and use POSIX
2c310 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20   style locks..  
2c320 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  ** Otherwise fal
2c330 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61  l back to the na
2c340 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65  med semaphore me
2c350 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63  thod..  */.  loc
2c360 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
2c370 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
2c380 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
2c390 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
2c3a0 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
2c3b0 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
2c3c0 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63  DLCK;.  if( osFc
2c3d0 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
2c3e0 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
2c3f0 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74  !=-1 ) {.    ret
2c400 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
2c410 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
2c420 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d    return &semIoM
2c430 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
2c440 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2c450 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
2c460 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b   *(*const vxwork
2c470 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  sIoFinder)(const
2c480 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2c490 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e  ) = vxworksIoFin
2c4a0 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
2c4b0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
2c4c0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
2c4d0 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
2c4e0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f  pointer to an IO
2c4f0 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
2c500 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65  unction:.*/.type
2c510 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  def const sqlite
2c520 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
2c530 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e  finder_type)(con
2c540 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2c550 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  e*);.../********
2c560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c5a0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2c5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c5c0 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
2c5d0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
2c5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c5f0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
2c600 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
2c610 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2c620 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
2c630 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
2c640 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
2c650 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
2c660 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2c670 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
2c680 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
2c690 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74  to by pId..*/.st
2c6a0 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55  atic int fillInU
2c6b0 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74  nixFile(.  sqlit
2c6c0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2c6d0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2c6e0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
2c6f0 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
2c700 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
2c710 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c720 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   of file being o
2c730 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
2c740 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
2c750 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
2c760 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
2c770 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2c780 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2c790 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
2c7a0 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
2c7b0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
2c7c0 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20  t ctrlFlags     
2c7d0 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72        /* Zero or
2c7e0 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a   more UNIXFILE_*
2c7f0 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
2c800 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2c810 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69  _methods *pLocki
2c820 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
2c830 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69  ile *pNew = (uni
2c840 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69  xFile *)pId;.  i
2c850 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c860 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  K;..  assert( pN
2c870 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c  ew->pInode==NULL
2c880 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63   );..  /* No loc
2c890 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74  king occurs in t
2c8a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
2c8b0 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  /.  assert( zFil
2c8c0 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72  ename!=0 || (ctr
2c8d0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2c8e0 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a  E_NOLOCK)!=0 );.
2c8f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
2c900 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
2c910 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b   h, zFilename));
2c920 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
2c930 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70    pNew->pVfs = p
2c940 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61  Vfs;.  pNew->zPa
2c950 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2c960 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2c970 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67  s = (u8)ctrlFlag
2c980 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  s;.#if SQLITE_MA
2c990 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
2c9a0 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  pNew->mmapSizeMa
2c9b0 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  x = sqlite3Globa
2c9c0 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a  lConfig.szMmap;.
2c9d0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
2c9e0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2c9f0 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55  (((ctrlFlags & U
2ca00 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a  NIXFILE_URI) ? z
2ca10 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20  Filename : 0),. 
2ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca30 20 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22            "psow"
2ca40 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41  , SQLITE_POWERSA
2ca50 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b  FE_OVERWRITE) ){
2ca60 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
2ca70 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2ca80 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28  _PSOW;.  }.  if(
2ca90 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e   strcmp(pVfs->zN
2caa0 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29  ame,"unix-excl")
2cab0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  ==0 ){.    pNew-
2cac0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2cad0 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d  IXFILE_EXCL;.  }
2cae0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
2caf0 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76  .  pNew->pId = v
2cb00 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
2cb10 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
2cb20 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20  f( pNew->pId==0 
2cb30 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73  ){.    ctrlFlags
2cb40 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c   |= UNIXFILE_NOL
2cb50 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  OCK;.    rc = SQ
2cb60 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2cb70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
2cb80 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55  f( ctrlFlags & U
2cb90 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29  NIXFILE_NOLOCK )
2cba0 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
2cbb0 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  yle = &nolockIoM
2cbc0 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
2cbd0 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
2cbe0 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f  le = (**(finder_
2cbf0 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70  type*)pVfs->pApp
2cc00 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c  Data)(zFilename,
2cc10 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49   pNew);.#if SQLI
2cc20 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2cc30 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43  G_STYLE.    /* C
2cc40 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69  ache zFilename i
2cc50 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
2cc60 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64  ntext (AFP and d
2cc70 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29  otlock override)
2cc80 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78   for.    ** prox
2cc90 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e  yLock activation
2cca0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65   is possible (re
2ccb0 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61  mote proxy is ba
2ccc0 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a  sed on db name).
2ccd0 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65      ** zFilename
2cce0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
2ccf0 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  ntil file is clo
2cd00 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20  sed, to support 
2cd10 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  */.    pNew->loc
2cd20 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76  kingContext = (v
2cd30 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a  oid*)zFilename;.
2cd40 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
2cd50 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2cd60 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  == &posixIoMetho
2cd70 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ds.#if defined(_
2cd80 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2cd90 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2cda0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20  NG_STYLE.    || 
2cdb0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2cdc0 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23   &nfsIoMethods.#
2cdd0 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75  endif.  ){.    u
2cde0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2cdf0 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
2ce00 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
2ce10 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
2ce20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ce30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
2ce40 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2ce50 72 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64  rred in findInod
2ce60 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74  eInfo(), close t
2ce70 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2ce80 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65  or.      ** imme
2ce90 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20  diately, before 
2cea0 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75  releasing the mu
2ceb0 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  tex. findInodeIn
2cec0 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20  fo() may fail.  
2ced0 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63      ** in two sc
2cee0 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a  enarios:.      *
2cef0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29  *.      **   (a)
2cf00 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74   A call to fstat
2cf10 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  () failed..     
2cf20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c   **   (b) A mall
2cf30 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  oc failed..     
2cf40 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65   **.      ** Sce
2cf50 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e  nario (b) may on
2cf60 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  ly occur if the 
2cf70 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
2cf80 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20  ng no other.    
2cf90 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
2cfa0 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  ptors open on th
2cfb0 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20  e same file. If 
2cfc0 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72  there were other
2cfd0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
2cfe0 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68  escriptors on th
2cff0 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  is file, then no
2d000 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65   malloc would be
2d010 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2d020 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49     ** findInodeI
2d030 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69  nfo(). If this i
2d040 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69  s the case, it i
2d050 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20  s quite safe to 
2d060 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  close.      ** h
2d070 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20  andle h - as it 
2d080 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
2d090 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b  at no posix lock
2d0a0 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73  s will be releas
2d0b0 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64  ed.      ** by d
2d0c0 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a  oing so..      *
2d0d0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63  *.      ** If sc
2d0e0 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65  enario (a) cause
2d0f0 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e  d the error then
2d100 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20   things are not 
2d110 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20  so safe. The.   
2d120 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61     ** implicit a
2d130 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69  ssumption here i
2d140 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28  s that if fstat(
2d150 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20  ) fails, things 
2d160 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  are in.      ** 
2d170 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74  such bad shape t
2d180 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c  hat dropping a l
2d190 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e  ock or two doesn
2d1a0 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a  't matter much..
2d1b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2d1c0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2d1d0 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2d1e0 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
2d1f0 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
2d200 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
2d210 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2d220 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
2d230 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2d240 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  E__).  else if( 
2d250 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2d260 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
2d270 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63  {.    /* AFP loc
2d280 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
2d290 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
2d2a0 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
2d2b0 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
2d2c0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
2d2d0 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  xt..    */.    a
2d2e0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
2d2f0 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77   *pCtx;.    pNew
2d300 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2d310 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
2d320 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
2d330 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20  of(*pCtx) );.   
2d340 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
2d350 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d360 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2d370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2d380 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20  * NB: zFilename 
2d390 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69  exists and remai
2d3a0 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ns valid until t
2d3b0 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  he file is close
2d3c0 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72  d.      ** accor
2d3d0 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d  ding to requirem
2d3e0 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20  ent F11141.  So 
2d3f0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2d400 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a  o make a.      *
2d410 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69  * copy of the fi
2d420 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  lename. */.     
2d430 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
2d440 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
2d450 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20   pCtx->reserved 
2d460 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64  = 0;.      srand
2d470 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75  omdev();.      u
2d480 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2d490 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64  .      rc = find
2d4a0 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
2d4b0 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
2d4c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d4d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d4e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d4f0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2d500 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72  text);.        r
2d510 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2d520 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2d530 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a          h = -1;.
2d540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e        }.      un
2d550 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20  ixLeaveMutex(); 
2d560 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20         .    }.  
2d570 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65  }.#endif..  else
2d580 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
2d590 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  le == &dotlockIo
2d5a0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2d5b0 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
2d5c0 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
2d5d0 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
2d5e0 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
2d5f0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f  in.    ** the do
2d600 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
2d610 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext .    */.    
2d620 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b  char *zLockFile;
2d630 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61  .    int nFilena
2d640 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  me;.    assert( 
2d650 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a  zFilename!=0 );.
2d660 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20      nFilename = 
2d670 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c  (int)strlen(zFil
2d680 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20  ename) + 6;.    
2d690 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
2d6a0 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
2d6b0 6f 63 36 34 28 6e 46 69 6c 65 6e 61 6d 65 29 3b  oc64(nFilename);
2d6c0 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69  .    if( zLockFi
2d6d0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  le==0 ){.      r
2d6e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2d6f0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
2d700 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2d710 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61  snprintf(nFilena
2d720 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22  me, zLockFile, "
2d730 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  %s" DOTLOCK_SUFF
2d740 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  IX, zFilename);.
2d750 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
2d760 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2d770 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a   zLockFile;.  }.
2d780 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2d790 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2d7a0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d  ingStyle == &sem
2d7b0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2d7c0 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68   /* Named semaph
2d7d0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ore locking uses
2d7e0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2d7f0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2d800 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64  .    ** included
2d810 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69   in the semLocki
2d820 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f  ngContext.    */
2d830 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
2d840 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
2d850 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2d860 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2d870 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d  e);.    if( (rc=
2d880 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28  =SQLITE_OK) && (
2d890 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2d8a0 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  em==NULL) ){.   
2d8b0 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d     char *zSemNam
2d8c0 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  e = pNew->pInode
2d8d0 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20  ->aSemName;.    
2d8e0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73    int n;.      s
2d8f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2d900 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53  MAX_PATHNAME, zS
2d910 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d  emName, "/%s.sem
2d920 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2d930 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2d940 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
2d950 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
2d960 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e   n=1; zSemName[n
2d970 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20  ]; n++ ).       
2d980 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d   if( zSemName[n]
2d990 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65  =='/' ) zSemName
2d9a0 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20  [n] = '_';.     
2d9b0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2d9c0 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a  Sem = sem_open(z
2d9d0 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54  SemName, O_CREAT
2d9e0 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20  , 0666, 1);.    
2d9f0 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f    if( pNew->pIno
2da00 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f  de->pSem == SEM_
2da10 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
2da20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2da30 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
2da40 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
2da50 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
2da60 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
2da70 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2da80 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
2da90 69 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61 73  if.  .  storeLas
2daa0 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b  tErrno(pNew, 0);
2dab0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2dac0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2dad0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
2dae0 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
2daf0 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2db00 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d  NE__);.    h = -
2db10 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  1;.    osUnlink(
2db20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2db30 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2db40 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45  |= UNIXFILE_DELE
2db50 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  TE;.  }.#endif. 
2db60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2db70 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
2db80 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
2db90 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
2dba0 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E__);.  }else{. 
2dbb0 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
2dbc0 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65   = pLockingStyle
2dbd0 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
2dbe0 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72 69 66  r(+1);.    verif
2dbf0 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20  yDbFile(pNew);. 
2dc00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2dc10 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2dc20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  the name of a di
2dc30 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68  rectory in which
2dc40 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72   to put temporar
2dc50 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e  y files..** If n
2dc60 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f  o suitable tempo
2dc70 72 61 72 79 20 66 69 6c 65 20 64 69 72 65 63 74  rary file direct
2dc80 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ory can be found
2dc90 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
2dca0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
2dcb0 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c  har *unixTempFil
2dcc0 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74  eDir(void){.  st
2dcd0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2dce0 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
2dcf0 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20     0,.     0,.  
2dd00 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20     "/var/tmp",. 
2dd10 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a      "/usr/tmp",.
2dd20 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
2dd30 20 20 22 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73    ".".  };.  uns
2dd40 69 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b  igned int i = 0;
2dd50 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
2dd60 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
2dd70 20 2a 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33   *zDir = sqlite3
2dd80 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
2dd90 0a 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b  ..  if( !azDirs[
2dda0 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d  0] ) azDirs[0] =
2ddb0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
2ddc0 54 4d 50 44 49 52 22 29 3b 0a 20 20 69 66 28 20  TMPDIR");.  if( 
2ddd0 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44  !azDirs[1] ) azD
2dde0 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28  irs[1] = getenv(
2ddf0 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 77 68 69  "TMPDIR");.  whi
2de00 6c 65 28 31 29 7b 0a 20 20 20 20 69 66 28 20 7a  le(1){.    if( z
2de10 44 69 72 21 3d 30 0a 20 20 20 20 20 26 26 20 6f  Dir!=0.     && o
2de20 73 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66  sStat(zDir, &buf
2de30 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 53 5f 49  )==0.     && S_I
2de40 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
2de50 29 0a 20 20 20 20 20 26 26 20 6f 73 41 63 63 65  ).     && osAcce
2de60 73 73 28 7a 44 69 72 2c 20 30 33 29 3d 3d 30 0a  ss(zDir, 03)==0.
2de70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
2de80 75 72 6e 20 7a 44 69 72 3b 0a 20 20 20 20 7d 0a  urn zDir;.    }.
2de90 20 20 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f      if( i>=sizeo
2dea0 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66  f(azDirs)/sizeof
2deb0 28 61 7a 44 69 72 73 5b 30 5d 29 20 29 20 62 72  (azDirs[0]) ) br
2dec0 65 61 6b 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20  eak;.    zDir = 
2ded0 61 7a 44 69 72 73 5b 69 2b 2b 5d 3b 0a 20 20 7d  azDirs[i++];.  }
2dee0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2def0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
2df00 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
2df10 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
2df20 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  f must be alloca
2df30 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ted.** by the ca
2df40 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e  lling process an
2df50 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  d must be big en
2df60 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20  ough to hold at 
2df70 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d  least.** pVfs->m
2df80 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e  xPathname bytes.
2df90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2dfa0 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69  nixGetTempname(i
2dfb0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2dfc0 42 75 66 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Buf){.  const ch
2dfd0 61 72 20 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20  ar *zDir;.  int 
2dfe0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f  iLimit = 0;..  /
2dff0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
2e000 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
2e010 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
2e020 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
2e030 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
2e040 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
2e050 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
2e060 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
2e070 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
2e080 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
2e090 0a 20 20 2a 2f 0a 20 20 7a 42 75 66 5b 30 5d 20  .  */.  zBuf[0] 
2e0a0 3d 20 30 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  = 0;.  SimulateI
2e0b0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2e0c0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
2e0d0 20 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d    zDir = unixTem
2e0e0 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66  pFileDir();.  if
2e0f0 28 20 7a 44 69 72 3d 3d 30 20 29 20 72 65 74 75  ( zDir==0 ) retu
2e100 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2e110 47 45 54 54 45 4d 50 50 41 54 48 3b 0a 20 20 64  GETTEMPPATH;.  d
2e120 6f 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20  o{.    u64 r;.  
2e130 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
2e140 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20  ness(sizeof(r), 
2e150 26 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  &r);.    assert(
2e160 20 6e 42 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a   nBuf>2 );.    z
2e170 42 75 66 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b  Buf[nBuf-2] = 0;
2e180 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2e190 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
2e1a0 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45  , "%s/"SQLITE_TE
2e1b0 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 22 25  MP_FILE_PREFIX"%
2e1c0 6c 6c 78 25 63 22 2c 0a 20 20 20 20 20 20 20 20  llx%c",.        
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 44 69               zDi
2e1e0 72 2c 20 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  r, r, 0);.    if
2e1f0 28 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d  ( zBuf[nBuf-2]!=
2e200 30 20 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e  0 || (iLimit++)>
2e210 31 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  10 ) return SQLI
2e220 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69  TE_ERROR;.  }whi
2e230 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75  le( osAccess(zBu
2e240 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  f,0)==0 );.  ret
2e250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2e260 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
2e270 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2e280 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
2e290 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f  PPLE__)./*.** Ro
2e2a0 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f  utine to transfo
2e2b0 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e  rm a unixFile in
2e2c0 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69  to a proxy-locki
2e2d0 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20  ng unixFile..** 
2e2e0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  Implementation i
2e2f0 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b  n the proxy-lock
2e300 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75   division, but u
2e310 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  sed by unixOpen(
2e320 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50  ).** if SQLITE_P
2e330 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
2e340 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  ING is defined..
2e350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2e360 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
2e370 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20  File(unixFile*, 
2e380 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65  const char*);.#e
2e390 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  ndif../*.** Sear
2e3a0 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
2e3b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e3c0 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64   that was opened
2e3d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2e3e0 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61   .** file (not a
2e3f0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74   journal or mast
2e400 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er-journal file)
2e410 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
2e420 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68  athname.** zPath
2e430 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45   with SQLITE_OPE
2e440 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63  N_XXX flags matc
2e450 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65  hing those passe
2e460 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a  d as the second.
2e470 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ** argument to t
2e480 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2e490 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20  .** Such a file 
2e4a0 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65  descriptor may e
2e4b0 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61  xist if a databa
2e4c0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  se connection wa
2e4d0 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20  s closed.** but 
2e4e0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
2e4f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63  ile descriptor c
2e500 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73  ould not be clos
2e510 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a  ed because some.
2e520 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ** other file de
2e530 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
2e540 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69   the same file i
2e550 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65  s holding a file
2e560 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20  -lock..** Refer 
2e570 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  to comments in t
2e580 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66  he unixClose() f
2e590 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20  unction and the 
2e5a0 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a  lengthy comment.
2e5b0 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22 50  ** describing "P
2e5c0 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
2e5d0 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73 74  cking" at the st
2e5e0 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65  art of this file
2e5f0 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72   for .** further
2e600 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20   details. Also, 
2e610 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a  ticket #4018..**
2e620 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c  .** If a suitabl
2e630 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2e640 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e  r is found, then
2e650 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
2e660 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66   If no.** such f
2e670 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
2e680 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73  s located, -1 is
2e690 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2e6a0 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46  atic UnixUnusedF
2e6b0 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46  d *findReusableF
2e6c0 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  d(const char *zP
2e6d0 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ath, int flags){
2e6e0 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
2e6f0 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20  *pUnused = 0;.. 
2e700 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63   /* Do not searc
2e710 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20  h for an unused 
2e720 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e730 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20  on vxworks. Not 
2e740 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77  because.  ** vxw
2e750 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62  orks would not b
2e760 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20  enefit from the 
2e770 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74  change (it might
2e780 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65  , we're not sure
2e790 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61  ),.  ** but beca
2e7a0 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65  use no way to te
2e7b0 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  st it is current
2e7c0 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74  ly available. It
2e7d0 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a   is better .  **
2e7e0 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65   not to risk bre
2e7f0 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75  aking vxworks su
2e800 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61  pport for the sa
2e810 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62  ke of such an ob
2e820 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74  scure .  ** feat
2e830 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53  ure.  */.#if !OS
2e840 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
2e850 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
2e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e870 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74  /* Results of st
2e880 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20  at() call */..  
2e890 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2e8a0 3b 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29  ;..  /* A stat()
2e8b0 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66   call may fail f
2e8c0 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f  or various reaso
2e8d0 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ns. If this happ
2e8e0 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ens, it is.  ** 
2e8f0 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
2e900 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61  hat an open() ca
2e910 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  ll on the same p
2e920 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61  ath will also fa
2e930 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69  il..  ** For thi
2e940 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20  s reason, if an 
2e950 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
2e960 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20  the stat() call 
2e970 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a  here, it is.  **
2e980 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20   ignored and -1 
2e990 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
2e9a0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79   caller will try
2e9b0 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
2e9c0 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
2e9d0 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  tor on the same 
2e9e0 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20  path, fail, and 
2e9f0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
2ea00 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a  to SQLite..  **.
2ea10 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73    ** Even if a s
2ea20 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29  ubsequent open()
2ea30 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65   call does succe
2ea40 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65  ed, the conseque
2ea50 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74  nces of.  ** not
2ea60 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61   searching for a
2ea70 20 72 65 75 73 61 62 6c 65 20 66 69 6c 65 20 64   reusable file d
2ea80 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f  escriptor are no
2ea90 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66  t dire.  */.  if
2eaa0 28 20 6e 55 6e 75 73 65 64 46 64 3e 30 20 26 26  ( nUnusedFd>0 &&
2eab0 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
2eac0 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2ead0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
2eae0 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 70 49 6e  pInode;..    pIn
2eaf0 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
2eb00 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  .    while( pIno
2eb10 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66  de && (pInode->f
2eb20 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74  ileId.dev!=sStat
2eb30 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20  .st_dev.        
2eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2eb50 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
2eb60 6e 6f 21 3d 28 75 36 34 29 73 53 74 61 74 2e 73  no!=(u64)sStat.s
2eb70 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
2eb80 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
2eb90 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
2eba0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
2ebb0 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
2ebc0 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
2ebd0 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
2ebe0 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
2ebf0 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
2ec00 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
2ec10 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
2ec20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
2ec30 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
2ec40 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 55 6e 75   ){.        nUnu
2ec50 73 65 64 46 64 2d 2d 3b 0a 20 20 20 20 20 20 20  sedFd--;.       
2ec60 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e   *pp = pUnused->
2ec70 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2ec80 20 20 20 7d 0a 20 20 7d 0a 20 20 75 6e 69 78 4c     }.  }.  unixL
2ec90 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 23 65 6e  eaveMutex();.#en
2eca0 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53  dif    /* if !OS
2ecb0 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65  _VXWORKS */.  re
2ecc0 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a  turn pUnused;.}.
2ecd0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2ece0 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64 20 67 69  mode, uid and gi
2ecf0 64 20 6f 66 20 66 69 6c 65 20 7a 46 69 6c 65 2e  d of file zFile.
2ed00 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
2ed10 67 65 74 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63  getFileMode(.  c
2ed20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2ed30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ed40 2a 20 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  * File name */. 
2ed50 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20   mode_t *pMode, 
2ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed70 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73   /* OUT: Permiss
2ed80 69 6f 6e 73 20 6f 66 20 7a 46 69 6c 65 20 2a 2f  ions of zFile */
2ed90 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
2eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edb0 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 6f     /* OUT: uid o
2edc0 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a 20 20 67 69  f zFile. */.  gi
2edd0 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20  d_t *pGid       
2ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2edf0 20 4f 55 54 3a 20 67 69 64 20 6f 66 20 7a 46 69   OUT: gid of zFi
2ee00 6c 65 2e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  le. */.){.  stru
2ee10 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
2ee20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2ee30 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20  utput of stat() 
2ee40 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
2ee50 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2ee60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2ee70 30 3d 3d 6f 73 53 74 61 74 28 7a 46 69 6c 65 2c  0==osStat(zFile,
2ee80 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2ee90 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73  *pMode = sStat.s
2eea0 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20  t_mode & 0777;. 
2eeb0 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74     *pUid = sStat
2eec0 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 2a 70 47  .st_uid;.    *pG
2eed0 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69  id = sStat.st_gi
2eee0 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
2eef0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2ef00 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 72  R_FSTAT;.  }.  r
2ef10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2ef20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2ef30 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e   is called by un
2ef40 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65  ixOpen() to dete
2ef50 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70  rmine the unix p
2ef60 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f  ermissions.** to
2ef70 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65   create new file
2ef80 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72  s with. If no er
2ef90 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
2efa0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2efb0 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20  turned.** and a 
2efc0 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66  value suitable f
2efd0 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68  or passing as th
2efe0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
2eff0 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a   to open(2) is.*
2f000 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d  * written to *pM
2f010 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ode. If an IO er
2f020 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
2f030 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2f040 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
2f050 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2f060 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20  f *pMode is not 
2f070 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
2f080 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 74  In most cases, t
2f090 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
2f0a0 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68   *pMode to 0, wh
2f0b0 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a  ich will become.
2f0c0 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e  ** an indication
2f0d0 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28   to robust_open(
2f0e0 29 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  ) to create the 
2f0f0 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51  file using.** SQ
2f100 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2f110 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64  E_PERMISSIONS ad
2f120 6a 75 73 74 65 64 20 62 79 20 74 68 65 20 75 6d  justed by the um
2f130 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74  ask..** But if t
2f140 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
2f150 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72  ened is a WAL or
2f160 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
2f170 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   file, then .** 
2f180 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75  this function qu
2f190 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73  eries the file-s
2f1a0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65  ystem for the pe
2f1b0 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
2f1c0 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
2f1d0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
2f1e0 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65   and sets *pMode
2f1f0 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20   to this value. 
2f200 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73  Whenever .** pos
2f210 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a  sible, WAL and j
2f220 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
2f230 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
2f240 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
2f250 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61  ons .** as the a
2f260 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
2f270 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
2f280 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  f the SQLITE_ENA
2f290 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70  BLE_8_3_NAMES op
2f2a0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
2f2b0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69   then the.** ori
2f2c0 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
2f2d0 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  s unavailable.  
2f2e0 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73  But 8_3_NAMES is
2f2f0 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a   only used for.*
2f300 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d  * FAT filesystem
2f310 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e  s and permission
2f320 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20  s do not matter 
2f330 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75  there, so just u
2f340 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  se.** the defaul
2f350 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a  t permissions..*
2f360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
2f370 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
2f380 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2f390 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
2f3a0 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69     /* Path of fi
2f3b0 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65  le (possibly) be
2f3c0 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20  ing created */. 
2f3d0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3f0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
2f400 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74   as 4th argument
2f410 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   to xOpen() */. 
2f420 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20   mode_t *pMode, 
2f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f440 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73   /* OUT: Permiss
2f450 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c  ions to open fil
2f460 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f  e with */.  uid_
2f470 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20  t *pUid,        
2f480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2f490 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f  UT: uid to set o
2f4a0 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
2f4b0 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20  gid_t *pGid     
2f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4d0 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73  /* OUT: gid to s
2f4e0 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a  et on the file *
2f4f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
2f500 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2f510 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2f520 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64   Code */.  *pMod
2f530 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d  e = 0;.  *pUid =
2f540 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b   0;.  *pGid = 0;
2f550 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28  .  if( flags & (
2f560 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
2f570 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f580 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
2f590 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41   char zDb[MAX_PA
2f5a0 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f  THNAME+1];     /
2f5b0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
2f5c0 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20  path */.    int 
2f5d0 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  nDb;            
2f5e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2f5f0 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74  ber of valid byt
2f600 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 0a 20 20  es in zDb */..  
2f610 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20    /* zPath is a 
2f620 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72  path to a WAL or
2f630 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
2f640 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2f650 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a  ck derives.    *
2f660 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  * the path to th
2f670 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
2f680 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20  abase file from 
2f690 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63  zPath. This bloc
2f6a0 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a  k handles.    **
2f6b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e   the following n
2f6c0 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  aming convention
2f6d0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2f6e0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2f6f0 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a  -journal".    **
2f700 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2f710 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  -wal".    **   "
2f720 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
2f730 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  rnalNN".    **  
2f740 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
2f750 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20  alNN".    **.   
2f760 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20   ** where NN is 
2f770 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  a decimal number
2f780 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
2f790 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
2f7a0 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
2f7b0 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
2f7c0 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
2f7d0 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
2f7e0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
2f7f0 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65   - 1; .    while
2f800 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d  ( zPath[nDb]!='-
2f810 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  ' ){.      /* In
2f820 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
2f830 6e 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  n, the journal f
2f840 69 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 61 6c  ile name will al
2f850 77 61 79 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20  ways contain.   
2f860 20 20 20 2a 2a 20 61 20 27 2d 27 20 63 68 61 72     ** a '-' char
2f870 61 63 74 65 72 2e 20 20 48 6f 77 65 76 65 72 20  acter.  However 
2f880 69 6e 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 20  in 8+3 filename 
2f890 6d 6f 64 65 2c 20 6f 72 20 69 66 20 61 20 63 6f  mode, or if a co
2f8a0 72 72 75 70 74 0a 20 20 20 20 20 20 2a 2a 20 72  rrupt.      ** r
2f8b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
2f8c0 73 70 65 63 69 66 69 65 73 20 61 20 6d 61 73 74  specifies a mast
2f8d0 65 72 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 20  er journal with 
2f8e0 61 20 67 6f 6f 66 79 20 6e 61 6d 65 2c 20 74 68  a goofy name, th
2f8f0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
2f900 27 2d 27 20 6d 69 67 68 74 20 62 65 20 6d 69 73  '-' might be mis
2f910 73 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69  sing. */.      i
2f920 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61  f( nDb==0 || zPa
2f930 74 68 5b 6e 44 62 5d 3d 3d 27 2e 27 20 29 20 72  th[nDb]=='.' ) r
2f940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f950 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20  .      nDb--;.  
2f960 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a    }.    memcpy(z
2f970 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
2f980 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
2f990 27 5c 30 27 3b 0a 0a 20 20 20 20 72 63 20 3d 20  '\0';..    rc = 
2f9a0 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a 44 62 2c  getFileMode(zDb,
2f9b0 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47   pMode, pUid, pG
2f9c0 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  id);.  }else if(
2f9d0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
2f9e0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
2f9f0 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65  SE ){.    *pMode
2fa00 20 3d 20 30 36 30 30 3b 0a 20 20 7d 65 6c 73 65   = 0600;.  }else
2fa10 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
2fa20 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a  ITE_OPEN_URI ){.
2fa30 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2fa40 73 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73  s a main databas
2fa50 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
2fa60 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 75  ile was opened u
2fa70 73 69 6e 67 20 61 20 55 52 49 0a 20 20 20 20 2a  sing a URI.    *
2fa80 2a 20 66 69 6c 65 6e 61 6d 65 2c 20 63 68 65 63  * filename, chec
2fa90 6b 20 66 6f 72 20 74 68 65 20 22 6d 6f 64 65 6f  k for the "modeo
2faa0 66 22 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66  f" parameter. If
2fab0 20 70 72 65 73 65 6e 74 2c 20 69 6e 74 65 72 70   present, interp
2fac0 72 65 74 0a 20 20 20 20 2a 2a 20 69 74 73 20 76  ret.    ** its v
2fad0 61 6c 75 65 20 61 73 20 61 20 66 69 6c 65 6e 61  alue as a filena
2fae0 6d 65 20 61 6e 64 20 74 72 79 20 74 6f 20 63 6f  me and try to co
2faf0 70 79 20 74 68 65 20 6d 6f 64 65 2c 20 75 69 64  py the mode, uid
2fb00 20 61 6e 64 20 67 69 64 20 66 72 6f 6d 0a 20 20   and gid from.  
2fb10 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 2e 20    ** that file. 
2fb20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
2fb30 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
2fb40 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 50  uri_parameter(zP
2fb50 61 74 68 2c 20 22 6d 6f 64 65 6f 66 22 29 3b 0a  ath, "modeof");.
2fb60 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
2fb70 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d     rc = getFileM
2fb80 6f 64 65 28 7a 2c 20 70 4d 6f 64 65 2c 20 70 55  ode(z, pMode, pU
2fb90 69 64 2c 20 70 47 69 64 29 3b 0a 20 20 20 20 7d  id, pGid);.    }
2fba0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2fbb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
2fbc0 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
2fbd0 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
2fbe0 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
2fbf0 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
2fc00 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
2fc10 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
2fc20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
2fc30 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
2fc40 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
2fc50 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
2fc60 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
2fc70 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
2fc80 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
2fc90 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
2fca0 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
2fcb0 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
2fcc0 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
2fcd0 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
2fce0 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
2fcf0 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
2fd00 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
2fd10 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
2fd20 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
2fd30 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
2fd40 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
2fd50 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
2fd60 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
2fd70 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
2fd80 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
2fd90 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
2fda0 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
2fdb0 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
2fdc0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
2fdd0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
2fde0 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
2fdf0 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
2fe00 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
2fe10 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
2fe20 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
2fe30 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
2fe40 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
2fe50 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
2fe60 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
2fe70 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
2fe80 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
2fe90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2fea0 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
2feb0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2fec0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
2fed0 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
2fee0 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
2fef0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
2ff00 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
2ff10 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
2ff20 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
2ff30 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
2ff40 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2ff50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ff60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2ff70 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
2ff80 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffa0 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
2ffb0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
2ffc0 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
2ffd0 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
2ffe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2fff0 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
30000 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
30010 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
30020 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
30030 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
30040 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
30050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
30060 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
30070 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
30080 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ) */.  int openF
30090 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
300a0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
300b0 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
300c0 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
300d0 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
300e0 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
300f0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
30100 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
30110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30120 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
30130 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
30140 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
30150 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
30160 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
30170 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
30180 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
30190 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
301a0 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f      /* UNIXFILE_
301b0 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e  * flags */..  in
301c0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
301d0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
301e0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
301f0 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
30200 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
30210 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
30220 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
30230 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
30240 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
30250 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
30260 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
30270 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
30280 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
30290 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
302a0 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
302b0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
302c0 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
302d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
302e0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
302f0 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
30300 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
30310 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
30320 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
30330 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
30340 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
30350 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73  OCKING_STYLE.  s
30360 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
30370 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  nfo;.#endif..  /
30380 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
30390 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66  master or main-f
303a0 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69  ile journal, thi
303b0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
303c0 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65  open.  ** a file
303d0 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74  -descriptor on t
303e0 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f  he directory too
303f0 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
30400 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a   unixSync().  **
30410 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64   is called the d
30420 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
30430 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
30440 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63   fsync()ed and c
30450 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20  lose()d..  */.  
30460 69 6e 74 20 69 73 4e 65 77 4a 72 6e 6c 20 3d 20  int isNewJrnl = 
30470 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
30480 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
30490 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
304a0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
304b0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
304c0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
304d0 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
304e0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
304f0 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  L.  ));..  /* If
30500 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
30510 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
30520 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
30530 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
30540 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
30550 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
30560 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
30570 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
30580 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
30590 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
305a0 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63  PATHNAME+2];.  c
305b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
305c0 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20   = zPath;..  /* 
305d0 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
305e0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
305f0 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
30600 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
30610 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
30620 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
30630 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
30640 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
30650 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
30660 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
30670 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
30680 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
30690 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
306a0 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
306b0 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
306c0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
306d0 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
306e0 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
306f0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
30700 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
30710 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
30720 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
30730 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
30740 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
30750 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
30760 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
30770 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
30780 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
30790 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
307a0 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
307b0 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
307c0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
307d0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
307e0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
307f0 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
30800 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
30810 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
30820 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
30830 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
30840 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
30850 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
30860 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
30870 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
30880 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
30890 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
308a0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
308b0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
308c0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
308d0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
308e0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
308f0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
30900 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
30910 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
30920 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
30930 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
30940 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
30950 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
30960 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
30970 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
30980 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
30990 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
309a0 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
309b0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
309c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
309d0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
309e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
309f0 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
30a00 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
30a10 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
30a20 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
30a30 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
30a40 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
30a50 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
30a60 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
30a70 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
30a80 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
30a90 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
30aa0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
30ab0 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
30ac0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
30ad0 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f  EN_WAL.  );..  /
30ae0 2a 20 44 65 74 65 63 74 20 61 20 70 69 64 20 63  * Detect a pid c
30af0 68 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20  hange and reset 
30b00 74 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65  the PRNG.  There
30b10 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
30b20 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73  tion.  ** here s
30b30 75 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20  uch that two or 
30b40 6d 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c  more threads all
30b50 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20   trying to open 
30b60 64 61 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a  databases at.  *
30b70 2a 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61  * the same insta
30b80 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73  nt might all res
30b90 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75  et the PRNG.  Bu
30ba0 74 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74  t multiple reset
30bb0 73 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c  s.  ** are harml
30bc0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
30bd0 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f  randomnessPid!=o
30be0 73 47 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20  sGetpid(0) ){.  
30bf0 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20    randomnessPid 
30c00 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20  = osGetpid(0);. 
30c10 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
30c20 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a  mness(0,0);.  }.
30c30 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
30c40 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
30c50 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d  );..  if( eType=
30c60 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
30c70 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78  N_DB ){.    Unix
30c80 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
30c90 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  d;.    pUnused =
30ca0 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
30cb0 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20  zName, flags);. 
30cc0 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
30cd0 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e  {.      fd = pUn
30ce0 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65  used->fd;.    }e
30cf0 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73  lse{.      pUnus
30d00 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
30d10 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55  loc64(sizeof(*pU
30d20 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69  nused));.      i
30d30 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20  f( !pUnused ){. 
30d40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
30d50 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
30d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30d70 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61     p->pPrealloca
30d80 74 65 64 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  tedUnused = pUnu
30d90 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74  sed;..    /* Dat
30da0 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20  abase filenames 
30db0 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20  are double-zero 
30dc0 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68  terminated if th
30dd0 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a  ey are not.    *
30de0 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61  * URIs with para
30df0 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20  meters.  Hence, 
30e00 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20  they can always 
30e10 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20  be passed into. 
30e20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72     ** sqlite3_ur
30e30 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a  i_parameter(). *
30e40 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 66  /.    assert( (f
30e50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
30e60 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65  EN_URI) || zName
30e70 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31  [strlen(zName)+1
30e80 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65  ]==0 );..  }else
30e90 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20   if( !zName ){. 
30ea0 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
30eb0 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65  s NULL, the uppe
30ec0 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65  r layer is reque
30ed0 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c  sting a temp fil
30ee0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
30ef0 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73  (isDelete && !is
30f00 4e 65 77 4a 72 6e 6c 29 3b 0a 20 20 20 20 72 63  NewJrnl);.    rc
30f10 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61   = unixGetTempna
30f20 6d 65 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  me(pVfs->mxPathn
30f30 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a  ame, zTmpname);.
30f40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30f50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
30f60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
30f70 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70      zName = zTmp
30f80 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  name;..    /* Ge
30f90 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72  nerated temporar
30fa0 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  y filenames are 
30fb0 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65  always double-ze
30fc0 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20  ro terminated.  
30fd0 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20    ** for use by 
30fe0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
30ff0 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20  meter(). */.    
31000 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74  assert( zName[st
31010 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d  rlen(zName)+1]==
31020 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  0 );.  }..  /* D
31030 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c  etermine the val
31040 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20  ue of the flags 
31050 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65 64  parameter passed
31060 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69   to POSIX functi
31070 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20  on.  ** open(). 
31080 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63 61  These must be ca
31090 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66  lculated even if
310a0 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63   open() is not c
310b0 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74  alled, as.  ** t
310c0 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65  hey may be store
310d0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
310e0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64   file handle and
310f0 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20 20   used by the .  
31100 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20  ** 'conch file' 
31110 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e  locking function
31120 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a  s later on.  */.
31130 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
31140 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d   )  openFlags |=
31150 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28   O_RDONLY;.  if(
31160 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f   isReadWrite ) o
31170 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
31180 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61  WR;.  if( isCrea
31190 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67  te )    openFlag
311a0 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20  s |= O_CREAT;.  
311b0 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
311c0 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28  ) openFlags |= (
311d0 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f  O_EXCL|O_NOFOLLO
311e0 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20  W);.  openFlags 
311f0 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  |= (O_LARGEFILE|
31200 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66  O_BINARY);..  if
31210 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f  ( fd<0 ){.    mo
31220 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20  de_t openMode;  
31230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31240 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72  ermissions to cr
31250 65 61 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a  eate file with *
31260 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b  /.    uid_t uid;
31270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31280 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f      /* Userid fo
31290 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  r the file */.  
312a0 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20    gid_t gid;    
312b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312c0 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74  /* Groupid for t
312d0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  he file */.    r
312e0 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69  c = findCreateFi
312f0 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c  leMode(zName, fl
31300 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20  ags, &openMode, 
31310 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20  &uid, &gid);.   
31320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31330 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
31340 72 74 28 20 21 70 2d 3e 70 50 72 65 61 6c 6c 6f  rt( !p->pPreallo
31350 63 61 74 65 64 55 6e 75 73 65 64 20 29 3b 0a 20  catedUnused );. 
31360 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
31370 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
31380 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  WAL || eType==SQ
31390 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
313a0 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20  OURNAL );.      
313b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
313c0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
313d0 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
313e0 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
313f0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
31400 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73  "OPENX   %-3d %s
31410 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61   0%o\n", fd, zNa
31420 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b  me, openFlags));
31430 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
31440 45 78 63 6c 75 73 69 76 65 20 7c 7c 20 28 6f 70  Exclusive || (op
31450 65 6e 46 6c 61 67 73 20 26 20 4f 5f 43 52 45 41  enFlags & O_CREA
31460 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  T)!=0 );.    if(
31470 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 69   fd<0 ){.      i
31480 66 28 20 69 73 4e 65 77 4a 72 6e 6c 20 26 26 20  f( isNewJrnl && 
31490 65 72 72 6e 6f 3d 3d 45 41 43 43 45 53 20 26 26  errno==EACCES &&
314a0 20 6f 73 41 63 63 65 73 73 28 7a 4e 61 6d 65 2c   osAccess(zName,
314b0 20 46 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20   F_OK) ){.      
314c0 20 20 2f 2a 20 49 66 20 75 6e 61 62 6c 65 20 74    /* If unable t
314d0 6f 20 63 72 65 61 74 65 20 61 20 6a 6f 75 72 6e  o create a journ
314e0 61 6c 20 62 65 63 61 75 73 65 20 74 68 65 20 64  al because the d
314f0 69 72 65 63 74 6f 72 79 20 69 73 20 6e 6f 74 0a  irectory is not.
31500 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74 61          ** writa
31510 62 6c 65 2c 20 63 68 61 6e 67 65 20 74 68 65 20  ble, change the 
31520 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 69 6e  error code to in
31530 64 69 63 61 74 65 20 74 68 61 74 2e 20 2a 2f 0a  dicate that. */.
31540 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
31550 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 49 52  ITE_READONLY_DIR
31560 45 43 54 4f 52 59 3b 0a 20 20 20 20 20 20 7d 65  ECTORY;.      }e
31570 6c 73 65 20 69 66 28 20 65 72 72 6e 6f 21 3d 45  lse if( errno!=E
31580 49 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57  ISDIR && isReadW
31590 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  rite ){.        
315a0 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
315b0 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
315c0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
315d0 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
315e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c 61 67   */.        flag
315f0 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50  s &= ~(SQLITE_OP
31600 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
31610 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
31620 3b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c  ;.        openFl
31630 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c  ags &= ~(O_RDWR|
31640 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20  O_CREAT);.      
31650 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
31660 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
31670 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  .        openFla
31680 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
31690 20 20 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e          isReadon
316a0 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ly = 1;.        
316b0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
316c0 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
316d0 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
316e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
316f0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
31700 20 20 69 6e 74 20 72 63 32 20 3d 20 75 6e 69 78    int rc2 = unix
31710 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
31720 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
31730 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  open", zName);. 
31740 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31750 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
31760 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  2;.      goto op
31770 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
31780 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
31790 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75  is process is ru
317a0 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e  nning as root an
317b0 64 20 69 66 20 63 72 65 61 74 69 6e 67 20 61 20  d if creating a 
317c0 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20  new rollback.   
317d0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57   ** journal or W
317e0 41 4c 20 66 69 6c 65 2c 20 73 65 74 20 74 68 65  AL file, set the
317f0 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31800 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c  e journal or WAL
31810 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 74 68   to be.    ** th
31820 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72  e same as the or
31830 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e  iginal database.
31840 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
31850 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
31860 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
31870 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
31880 4c 29 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75  L) ){.      robu
31890 73 74 46 63 68 6f 77 6e 28 66 64 2c 20 75 69 64  stFchown(fd, uid
318a0 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  , gid);.    }.  
318b0 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d  }.  assert( fd>=
318c0 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46  0 );.  if( pOutF
318d0 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75  lags ){.    *pOu
318e0 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
318f0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50    }..  if( p->pP
31900 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
31910 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  d ){.    p->pPre
31920 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 2d  allocatedUnused-
31930 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d  >fd = fd;.    p-
31940 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
31950 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  used->flags = fl
31960 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
31970 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
31980 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a  OS_VXWORKS.    z
31990 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65  Path = zName;.#e
319a0 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
319b0 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f  TE_UNLINK_AFTER_
319c0 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50 61 74 68  CLOSE).    zPath
319d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
319e0 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  tf("%s", zName);
319f0 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  .    if( zPath==
31a00 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
31a10 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
31a20 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
31a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
31a40 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
31a50 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69  #else.    osUnli
31a60 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69  nk(zName);.#endi
31a70 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  f.  }.#if SQLITE
31a80 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
31a90 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20  STYLE.  else{.  
31aa0 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d    p->openFlags =
31ab0 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a   openFlags;.  }.
31ac0 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20 64 65  #endif.  .#if de
31ad0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
31ae0 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
31af0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
31b00 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64    if( fstatfs(fd
31b10 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
31b20 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
31b30 74 45 72 72 6e 6f 28 70 2c 20 65 72 72 6e 6f 29  tErrno(p, errno)
31b40 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
31b50 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
31b60 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  __);.    return 
31b70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
31b80 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30  ESS;.  }.  if (0
31b90 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64   == strncmp("msd
31ba0 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73  os", fsInfo.f_fs
31bb0 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a  typename, 5)) {.
31bc0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
31bd0 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20  pFile)->fsFlags 
31be0 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  |= SQLITE_FSFLAG
31bf0 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a  S_IS_MSDOS;.  }.
31c00 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63    if (0 == strnc
31c10 6d 70 28 22 65 78 66 61 74 22 2c 20 66 73 49 6e  mp("exfat", fsIn
31c20 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
31c30 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   5)) {.    ((uni
31c40 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
31c50 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
31c60 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
31c70 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  S;.  }.#endif.. 
31c80 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f   /* Set up appro
31c90 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73  priate ctrlFlags
31ca0 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65   */.  if( isDele
31cb0 74 65 20 29 20 20 20 20 20 20 20 20 20 20 20 20  te )            
31cc0 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
31cd0 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
31ce0 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  ;.  if( isReadon
31cf0 6c 79 20 29 20 20 20 20 20 20 20 20 20 20 20 20  ly )            
31d00 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
31d10 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a  NIXFILE_RDONLY;.
31d20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65    noLock = eType
31d30 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
31d40 49 4e 5f 44 42 3b 0a 20 20 69 66 28 20 6e 6f 4c  IN_DB;.  if( noL
31d50 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20 20 20  ock )           
31d60 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
31d70 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c   |= UNIXFILE_NOL
31d80 4f 43 4b 3b 0a 20 20 69 66 28 20 69 73 4e 65 77  OCK;.  if( isNew
31d90 4a 72 6e 6c 20 29 20 20 20 20 20 20 20 20 20 20  Jrnl )          
31da0 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
31db0 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  = UNIXFILE_DIRSY
31dc0 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  NC;.  if( flags 
31dd0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
31de0 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d  I ) ctrlFlags |=
31df0 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a   UNIXFILE_URI;..
31e00 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
31e10 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
31e20 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45  #if SQLITE_PREFE
31e30 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
31e40 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20    isAutoProxy = 
31e50 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  1;.#endif.  if( 
31e60 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28  isAutoProxy && (
31e70 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20  zPath!=NULL) && 
31e80 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66  (!noLock) && pVf
31e90 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  s->xOpen ){.    
31ea0 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d  char *envforce =
31eb0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
31ec0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
31ed0 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75  ING");.    int u
31ee0 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20  seProxy = 0;..  
31ef0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43    /* SQLITE_FORC
31f00 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d  E_PROXY_LOCKING=
31f10 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61  =1 means force a
31f20 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c  lways use proxy,
31f30 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a   0 means .    **
31f40 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79   never use proxy
31f50 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65  , NULL means use
31f60 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c   proxy for non-l
31f70 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e  ocal files only.
31f80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76    */.    if( env
31f90 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20  force!=NULL ){. 
31fa0 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
31fb0 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30  atoi(envforce)>0
31fc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31fd0 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
31fe0 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
31ff0 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
32000 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
32010 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
32020 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
32030 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20  Vfs, fd, pFile, 
32040 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73  zPath, ctrlFlags
32050 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
32060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32070 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
32080 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
32090 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69  e((unixFile*)pFi
320a0 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20  le, ":auto:");. 
320b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
320c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
320d0 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69        /* Use uni
320e0 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20  xClose to clean 
320f0 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  up the resources
32100 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e   added in fillIn
32110 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20  UnixFile .      
32120 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72      ** and clear
32130 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75   all the structu
32140 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e  re's references.
32150 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
32160 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46  .          ** pF
32170 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69  ile->pMethods wi
32180 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71  ll be NULL so sq
32190 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c  lite3OsClose wil
321a0 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20  l be a no-op .  
321b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
321c0 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70       unixClose(p
321d0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
321e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
321f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32200 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
32210 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
32220 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 61 73  }.#endif.  .  as
32230 73 65 72 74 28 20 7a 50 61 74 68 3d 3d 30 20 7c  sert( zPath==0 |
32240 7c 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20  | zPath[0]=='/' 
32250 0a 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  .      || eType=
32260 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
32270 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  TER_JOURNAL || e
32280 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
32290 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a  N_MAIN_JOURNAL .
322a0 20 20 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c    );.  rc = fill
322b0 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
322c0 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74   fd, pFile, zPat
322d0 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a  h, ctrlFlags);..
322e0 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20  open_finished:. 
322f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32300 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
32310 33 5f 66 72 65 65 28 70 2d 3e 70 50 72 65 61 6c  3_free(p->pPreal
32320 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 29 3b 0a  locatedUnused);.
32330 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
32340 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  .}.../*.** Delet
32350 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50  e the file at zP
32360 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
32370 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
32380 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a  true, fsync().**
32390 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
323a0 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  fter deleting th
323b0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
323c0 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65  c int unixDelete
323d0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
323e0 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a  *NotUsed,     /*
323f0 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
32400 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c  this as the xDel
32410 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ete method */.  
32420 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
32430 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  h,        /* Nam
32440 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
32450 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
32460 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20   dirSync        
32470 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
32480 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63  e, fsync() direc
32490 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
324a0 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ing file */.){. 
324b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
324c0 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  _OK;.  UNUSED_PA
324d0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
324e0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
324f0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
32500 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
32510 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28  .  if( osUnlink(
32520 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a  zPath)==(-1) ){.
32530 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45      if( errno==E
32540 4e 4f 45 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57  NOENT.#if OS_VXW
32550 4f 52 4b 53 0a 20 20 20 20 20 20 20 20 7c 7c 20  ORKS.        || 
32560 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 30  osAccess(zPath,0
32570 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20  )!=0.#endif.    
32580 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
32590 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
325a0 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  E_NOENT;.    }el
325b0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75  se{.      rc = u
325c0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
325d0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
325e0 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68   "unlink", zPath
325f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
32600 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e  urn rc;.  }.#ifn
32610 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
32620 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28  LE_DIRSYNC.  if(
32630 20 28 64 69 72 53 79 6e 63 20 26 20 31 29 21 3d   (dirSync & 1)!=
32640 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b  0 ){.    int fd;
32650 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e  .    rc = osOpen
32660 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
32670 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72   &fd);.    if( r
32680 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32690 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 5f 66        if( full_f
326a0 73 79 6e 63 28 66 64 2c 30 2c 30 29 20 29 7b 0a  sync(fd,0,0) ){.
326b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
326c0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
326d0 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
326e0 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68  , "fsync", zPath
326f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
32700 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c   robust_close(0,
32710 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
32720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32730 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
32740 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a  ITE_CANTOPEN );.
32750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32760 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
32770 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
32780 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  rc;.}../*.** Tes
32790 74 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20  t the existence 
327a0 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72  of or access per
327b0 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65  missions of file
327c0 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74   zPath. The.** t
327d0 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65  est performed de
327e0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
327f0 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ue of flags:.**.
32800 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
32810 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74  CESS_EXISTS: Ret
32820 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
32830 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20  e exists.**     
32840 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
32850 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20  ADWRITE: Return 
32860 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
32870 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62   read and writab
32880 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  le..**     SQLIT
32890 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c  E_ACCESS_READONL
328a0 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  Y: Return 1 if t
328b0 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61  he file is reada
328c0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ble..**.** Other
328d0 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  wise return 0..*
328e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
328f0 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  xAccess(.  sqlit
32900 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
32910 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f     /* The VFS co
32920 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41  ntaining this xA
32930 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a  ccess method */.
32940 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
32950 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74  ath,      /* Pat
32960 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  h of the file to
32970 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e   examine */.  in
32980 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
32990 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f        /* What do
329a0 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72   we want to lear
329b0 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74  n about the zPat
329c0 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74  h file? */.  int
329d0 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
329e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
329f0 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72  sult boolean her
32a00 65 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  e */.){.  UNUSED
32a10 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32a20 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
32a30 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
32a40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
32a50 53 53 3b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  SS; );.  assert(
32a60 20 70 52 65 73 4f 75 74 21 3d 30 20 29 3b 0a 0a   pResOut!=0 );..
32a70 20 20 2f 2a 20 54 68 65 20 73 70 65 63 20 73 61    /* The spec sa
32a80 79 73 20 74 68 65 72 65 20 61 72 65 20 74 68 72  ys there are thr
32a90 65 65 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 75  ee possible valu
32aa0 65 73 20 66 6f 72 20 66 6c 61 67 73 2e 20 20 42  es for flags.  B
32ab0 75 74 20 6f 6e 6c 79 0a 20 20 2a 2a 20 74 77 6f  ut only.  ** two
32ac0 20 6f 66 20 74 68 65 6d 20 61 72 65 20 61 63 74   of them are act
32ad0 75 61 6c 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20  ually used */.  
32ae0 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 53  assert( flags==S
32af0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
32b00 53 54 53 20 7c 7c 20 66 6c 61 67 73 3d 3d 53 51  STS || flags==SQ
32b10 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
32b20 57 52 49 54 45 20 29 3b 0a 0a 20 20 69 66 28 20  WRITE );..  if( 
32b30 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
32b40 43 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a 20  CESS_EXISTS ){. 
32b50 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
32b60 75 66 3b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74  uf;.    *pResOut
32b70 20 3d 20 28 30 3d 3d 6f 73 53 74 61 74 28 7a 50   = (0==osStat(zP
32b80 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75  ath, &buf) && bu
32b90 66 2e 73 74 5f 73 69 7a 65 3e 30 29 3b 0a 20 20  f.st_size>0);.  
32ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 73  }else{.    *pRes
32bb0 4f 75 74 20 3d 20 6f 73 41 63 63 65 73 73 28 7a  Out = osAccess(z
32bc0 50 61 74 68 2c 20 57 5f 4f 4b 7c 52 5f 4f 4b 29  Path, W_OK|R_OK)
32bd0 3d 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ==0;.  }.  retur
32be0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
32bf0 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
32c00 69 6e 74 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61  int mkFullPathna
32c10 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me(.  const char
32c20 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
32c30 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 70        /* Input p
32c40 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ath */.  char *z
32c50 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
32c60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
32c70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  ut buffer */.  i
32c80 6e 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  nt nOut         
32c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32ca0 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
32cb0 20 6f 66 20 62 75 66 66 65 72 20 7a 4f 75 74 20   of buffer zOut 
32cc0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 74  */.){.  int nPat
32cd0 68 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  h = sqlite3Strle
32ce0 6e 33 30 28 7a 50 61 74 68 29 3b 0a 20 20 69 6e  n30(zPath);.  in
32cf0 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 69 66  t iOff = 0;.  if
32d00 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27 2f 27 20  ( zPath[0]!='/' 
32d10 29 7b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  ){.    if( osGet
32d20 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 32  cwd(zOut, nOut-2
32d30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
32d40 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
32d50 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
32d60 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22  N_BKPT, "getcwd"
32d70 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
32d80 20 20 20 20 69 4f 66 66 20 3d 20 73 71 6c 69 74      iOff = sqlit
32d90 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29  e3Strlen30(zOut)
32da0 3b 0a 20 20 20 20 7a 4f 75 74 5b 69 4f 66 66 2b  ;.    zOut[iOff+
32db0 2b 5d 20 3d 20 27 2f 27 3b 0a 20 20 7d 0a 20 20  +] = '/';.  }.  
32dc0 69 66 28 20 28 69 4f 66 66 2b 6e 50 61 74 68 2b  if( (iOff+nPath+
32dd0 31 29 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 2f  1)>nOut ){.    /
32de0 2a 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 73  * SQLite assumes
32df0 20 74 68 61 74 20 78 46 75 6c 6c 50 61 74 68 6e   that xFullPathn
32e00 61 6d 65 28 29 20 6e 75 6c 2d 74 65 72 6d 69 6e  ame() nul-termin
32e10 61 74 65 73 20 74 68 65 20 6f 75 74 70 75 74 20  ates the output 
32e20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 65 76  buffer.    ** ev
32e30 65 6e 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  en if it returns
32e40 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20   an error.  */. 
32e50 20 20 20 7a 4f 75 74 5b 69 4f 66 66 5d 20 3d 20     zOut[iOff] = 
32e60 27 5c 30 27 3b 0a 20 20 20 20 72 65 74 75 72 6e  '\0';.    return
32e70 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
32e80 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
32e90 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
32ea0 75 74 2d 69 4f 66 66 2c 20 26 7a 4f 75 74 5b 69  ut-iOff, &zOut[i
32eb0 4f 66 66 5d 2c 20 22 25 73 22 2c 20 7a 50 61 74  Off], "%s", zPat
32ec0 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  h);.  return SQL
32ed0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
32ee0 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
32ef0 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
32f00 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
32f10 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  The relative pat
32f20 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61  h.** is stored a
32f30 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
32f40 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65  ed string in the
32f50 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
32f60 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20  to by.** zPath. 
32f70 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e  .**.** zOut poin
32f80 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  ts to a buffer o
32f90 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74  f at least sqlit
32fa0 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
32fb0 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20  e bytes .** (in 
32fc0 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50  this case, MAX_P
32fd0 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20  ATHNAME bytes). 
32fe0 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73  The full-path is
32ff0 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74   written to.** t
33000 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72  his buffer befor
33010 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
33020 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
33030 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
33040 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
33050 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
33060 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
33070 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
33080 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
33090 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
330a0 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
330b0 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
330c0 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20  t nOut,         
330d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
330e0 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
330f0 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
33100 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20  .  char *zOut   
33110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33120 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
33130 72 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 64 65 66  r */.){.#if !def
33140 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49  ined(HAVE_READLI
33150 4e 4b 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  NK) || !defined(
33160 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20 72 65  HAVE_LSTAT).  re
33170 74 75 72 6e 20 6d 6b 46 75 6c 6c 50 61 74 68 6e  turn mkFullPathn
33180 61 6d 65 28 7a 50 61 74 68 2c 20 7a 4f 75 74 2c  ame(zPath, zOut,
33190 20 6e 4f 75 74 29 3b 0a 23 65 6c 73 65 0a 20 20   nOut);.#else.  
331a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
331b0 4f 4b 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  OK;.  int nByte;
331c0 0a 20 20 69 6e 74 20 6e 4c 69 6e 6b 20 3d 20 31  .  int nLink = 1
331d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
331e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 79   /* Number of sy
331f0 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 20 66 6f 6c  mbolic links fol
33200 6c 6f 77 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  lowed so far */.
33210 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
33220 6e 20 3d 20 7a 50 61 74 68 3b 20 20 20 20 20 20  n = zPath;      
33230 2f 2a 20 49 6e 70 75 74 20 70 61 74 68 20 66 6f  /* Input path fo
33240 72 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e  r each iteration
33250 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68   of loop */.  ch
33260 61 72 20 2a 7a 44 65 6c 20 3d 20 30 3b 0a 0a 20  ar *zDel = 0;.. 
33270 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d   assert( pVfs->m
33280 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50  xPathname==MAX_P
33290 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55  ATHNAME );.  UNU
332a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
332b0 66 73 29 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  fs);..  /* It's 
332c0 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
332d0 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
332e0 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
332f0 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
33300 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
33310 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
33320 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
33330 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
33340 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
33350 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
33360 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
33370 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
33380 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
33390 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
333a0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
333b0 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
333c0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
333d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
333e0 52 52 4f 52 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  RROR );..  do {.
333f0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 73 74 61  .    /* Call sta
33400 74 28 29 20 6f 6e 20 70 61 74 68 20 7a 49 6e 2e  t() on path zIn.
33410 20 53 65 74 20 62 4c 69 6e 6b 20 74 6f 20 74 72   Set bLink to tr
33420 75 65 20 69 66 20 74 68 65 20 70 61 74 68 20 69  ue if the path i
33430 73 20 61 20 73 79 6d 62 6f 6c 69 63 0a 20 20 20  s a symbolic.   
33440 20 2a 2a 20 6c 69 6e 6b 2c 20 6f 72 20 66 61 6c   ** link, or fal
33450 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 20 2a  se otherwise.  *
33460 2f 0a 20 20 20 20 69 6e 74 20 62 4c 69 6e 6b 20  /.    int bLink 
33470 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
33480 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66  stat buf;.    if
33490 28 20 6f 73 4c 73 74 61 74 28 7a 49 6e 2c 20 26  ( osLstat(zIn, &
334a0 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  buf)!=0 ){.     
334b0 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45   if( errno!=ENOE
334c0 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NT ){.        rc
334d0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
334e0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
334f0 42 4b 50 54 2c 20 22 6c 73 74 61 74 22 2c 20 7a  BKPT, "lstat", z
33500 49 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  In);.      }.   
33510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 4c   }else{.      bL
33520 69 6e 6b 20 3d 20 53 5f 49 53 4c 4e 4b 28 62 75  ink = S_ISLNK(bu
33530 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20 20 20 20  f.st_mode);.    
33540 7d 0a 0a 20 20 20 20 69 66 28 20 62 4c 69 6e 6b  }..    if( bLink
33550 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 44   ){.      if( zD
33560 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  el==0 ){.       
33570 20 7a 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zDel = sqlite3_
33580 6d 61 6c 6c 6f 63 28 6e 4f 75 74 29 3b 0a 20 20  malloc(nOut);.  
33590 20 20 20 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d        if( zDel==
335a0 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
335b0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
335c0 20 20 7d 65 6c 73 65 20 69 66 28 20 2b 2b 6e 4c    }else if( ++nL
335d0 69 6e 6b 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ink>SQLITE_MAX_S
335e0 59 4d 4c 49 4e 4b 53 20 29 7b 0a 20 20 20 20 20  YMLINKS ){.     
335f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
33600 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
33610 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
33620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33630 7b 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65 20  {.        nByte 
33640 3d 20 6f 73 52 65 61 64 6c 69 6e 6b 28 7a 49 6e  = osReadlink(zIn
33650 2c 20 7a 44 65 6c 2c 20 6e 4f 75 74 2d 31 29 3b  , zDel, nOut-1);
33660 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 42 79  .        if( nBy
33670 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  te<0 ){.        
33680 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
33690 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
336a0 50 45 4e 5f 42 4b 50 54 2c 20 22 72 65 61 64 6c  PEN_BKPT, "readl
336b0 69 6e 6b 22 2c 20 7a 49 6e 29 3b 0a 20 20 20 20  ink", zIn);.    
336c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
336d0 20 20 20 20 20 69 66 28 20 7a 44 65 6c 5b 30 5d       if( zDel[0]
336e0 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  !='/' ){.       
336f0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
33700 20 20 20 20 20 20 20 20 66 6f 72 28 6e 20 3d 20          for(n = 
33710 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
33720 7a 49 6e 29 3b 20 6e 3e 30 20 26 26 20 7a 49 6e  zIn); n>0 && zIn
33730 5b 6e 2d 31 5d 21 3d 27 2f 27 3b 20 6e 2d 2d 29  [n-1]!='/'; n--)
33740 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
33750 28 20 6e 42 79 74 65 2b 6e 2b 31 3e 6e 4f 75 74  ( nByte+n+1>nOut
33760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33770 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
33780 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
33790 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
337a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
337b0 6d 6d 6f 76 65 28 26 7a 44 65 6c 5b 6e 5d 2c 20  mmove(&zDel[n], 
337c0 7a 44 65 6c 2c 20 6e 42 79 74 65 2b 31 29 3b 0a  zDel, nByte+1);.
337d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
337e0 6d 63 70 79 28 7a 44 65 6c 2c 20 7a 49 6e 2c 20  mcpy(zDel, zIn, 
337f0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
33800 20 20 6e 42 79 74 65 20 2b 3d 20 6e 3b 0a 20 20    nByte += n;.  
33810 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33830 20 20 7a 44 65 6c 5b 6e 42 79 74 65 5d 20 3d 20    zDel[nByte] = 
33840 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a  '\0';.        }.
33850 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a        }..      z
33860 49 6e 20 3d 20 7a 44 65 6c 3b 0a 20 20 20 20 7d  In = zDel;.    }
33870 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
33880 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a  !=SQLITE_OK || z
33890 49 6e 21 3d 7a 4f 75 74 20 7c 7c 20 7a 49 6e 5b  In!=zOut || zIn[
338a0 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 20 20 69  0]=='/' );.    i
338b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
338c0 20 26 26 20 7a 49 6e 21 3d 7a 4f 75 74 20 29 7b   && zIn!=zOut ){
338d0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6b 46 75  .      rc = mkFu
338e0 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 49 6e 2c 20  llPathname(zIn, 
338f0 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a 20 20 20  zOut, nOut);.   
33900 20 7d 0a 20 20 20 20 69 66 28 20 62 4c 69 6e 6b   }.    if( bLink
33910 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
33920 20 7a 49 6e 20 3d 20 7a 4f 75 74 3b 0a 20 20 7d   zIn = zOut;.  }
33930 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
33940 45 5f 4f 4b 20 29 3b 0a 0a 20 20 73 71 6c 69 74  E_OK );..  sqlit
33950 65 33 5f 66 72 65 65 28 7a 44 65 6c 29 3b 0a 20  e3_free(zDel);. 
33960 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
33970 69 66 20 20 20 2f 2a 20 48 41 56 45 5f 52 45 41  if   /* HAVE_REA
33980 44 4c 49 4e 4b 20 26 26 20 48 41 56 45 5f 4c 53  DLINK && HAVE_LS
33990 54 41 54 20 2a 2f 0a 7d 0a 0a 0a 23 69 66 6e 64  TAT */.}...#ifnd
339a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
339b0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
339c0 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
339d0 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
339e0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
339f0 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
33a00 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
33a10 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
33a20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
33a30 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
33a40 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66  */.#include <dlf
33a50 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  cn.h>.static voi
33a60 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71  d *unixDlOpen(sq
33a70 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
33a80 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ed, const char *
33a90 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e  zFilename){.  UN
33aa0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
33ab0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
33ac0 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
33ad0 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
33ae0 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a  TLD_GLOBAL);.}..
33af0 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c  /*.** SQLite cal
33b00 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
33b10 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
33b20 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69  er a call to uni
33b30 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75  xDlSym() or.** u
33b40 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c  nixDlOpen() fail
33b50 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  s (returns a nul
33b60 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61  l pointer). If a
33b70 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65   more detailed e
33b80 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
33b90 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74  is available, it
33ba0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a   is written to z
33bb0 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72  BufOut. If no er
33bc0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
33bd0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75  s available, zBu
33be0 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d  fOut is left unm
33bf0 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69  odified and SQLi
33c00 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c  te uses a defaul
33c10 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  t.** error messa
33c20 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
33c30 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73  id unixDlError(s
33c40 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
33c50 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
33c60 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
33c70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
33c80 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  r;.  UNUSED_PARA
33c90 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33ca0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
33cb0 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65  ();.  zErr = dle
33cc0 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45  rror();.  if( zE
33cd0 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
33ce0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
33cf0 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20   zBufOut, "%s", 
33d00 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  zErr);.  }.  uni
33d10 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
33d20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75  .static void (*u
33d30 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nixDlSym(sqlite3
33d40 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
33d50 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  oid *p, const ch
33d60 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  ar*zSym))(void){
33d70 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20  .  /* .  ** GCC 
33d80 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
33d90 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20  rrors says that 
33da0 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  C90 does not all
33db0 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65  ow a void* to be
33dc0 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20  .  ** cast into 
33dd0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
33de0 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65  unction.  And ye
33df0 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c  t the library dl
33e00 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  sym() routine.  
33e10 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69  ** returns a voi
33e20 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c  d* which is real
33e30 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
33e40 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20  a function.  So 
33e50 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75  how do we.  ** u
33e60 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20  se dlsym() with 
33e70 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
33e80 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69  ?.  **.  ** Vari
33e90 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20  able x below is 
33ea0 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20  defined to be a 
33eb0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
33ec0 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a  ction taking.  *
33ed0 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69  * parameters voi
33ee0 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61  d* and const cha
33ef0 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  r* and returning
33f00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
33f10 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57  function..  ** W
33f20 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62  e initialize x b
33f30 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61  y assigning it a
33f40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
33f50 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e  dlsym() function
33f60 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73  ..  ** (That ass
33f70 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73  ignment requires
33f80 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20   a cast.)  Then 
33f90 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63  we call the func
33fa0 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78  tion that.  ** x
33fb0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20   points to.  .  
33fc0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72  **.  ** This wor
33fd0 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69  k-around is unli
33fe0 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72  kely to work cor
33ff0 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79  rectly on any sy
34000 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20  stem where.  ** 
34010 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f  you really canno
34020 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f  t cast a functio
34030 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76  n pointer into v
34040 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c  oid*.  But then,
34050 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   on the.  ** oth
34060 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29  er hand, dlsym()
34070 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f   will not work o
34080 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20  n such a system 
34090 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61  either, so we ha
340a0 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c  ve.  ** not real
340b0 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67  ly lost anything
340c0 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ..  */.  void (*
340d0 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  (*x)(void*,const
340e0 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a   char*))(void);.
340f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34100 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78  ER(NotUsed);.  x
34110 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f   = (void(*(*)(vo
34120 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
34130 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20  )(void))dlsym;. 
34140 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20   return (*x)(p, 
34150 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20  zSym);.}.static 
34160 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65  void unixDlClose
34170 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
34180 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61  tUsed, void *pHa
34190 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
341a0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
341b0 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48  d);.  dlclose(pH
341c0 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
341d0 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
341e0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
341f0 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
34200 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
34210 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e  Open  0.  #defin
34220 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a  e unixDlError 0.
34230 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
34240 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
34250 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a  e unixDlClose 0.
34260 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
34270 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f  ite nBuf bytes o
34280 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f  f random data to
34290 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
342a0 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  ffer zBuf..*/.st
342b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e  atic int unixRan
342c0 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
342d0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
342e0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
342f0 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
34300 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
34310 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65  ;.  assert((size
34320 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66  _t)nBuf>=(sizeof
34330 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28  (time_t)+sizeof(
34340 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65  int)));..  /* We
34350 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
34360 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
34370 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
34380 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
34390 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
343a0 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
343b0 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
343c0 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
343d0 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
343e0 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
343f0 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
34400 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
34410 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
34420 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
34430 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
34440 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
34450 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
34460 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
34470 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
34480 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
34490 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
344a0 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
344b0 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
344c0 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
344d0 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
344e0 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
344f0 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
34500 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
34510 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
34520 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
34530 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
34540 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
34550 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
34560 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
34570 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
34580 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
34590 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
345a0 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
345b0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
345c0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
345d0 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73  f);.  randomness
345e0 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30  Pid = osGetpid(0
345f0 29 3b 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  );  .#if !define
34600 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26  d(SQLITE_TEST) &
34610 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
34620 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53  E_OMIT_RANDOMNES
34630 53 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 66  S).  {.    int f
34640 64 2c 20 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d  d, got;.    fd =
34650 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64   robust_open("/d
34660 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52  ev/urandom", O_R
34670 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69  DONLY, 0);.    i
34680 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
34690 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20   time_t t;.     
346a0 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20   time(&t);.     
346b0 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74   memcpy(zBuf, &t
346c0 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20  , sizeof(t));.  
346d0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
346e0 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 72 61  [sizeof(t)], &ra
346f0 6e 64 6f 6d 6e 65 73 73 50 69 64 2c 20 73 69 7a  ndomnessPid, siz
34700 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69  eof(randomnessPi
34710 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
34720 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
34730 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69  eof(randomnessPi
34740 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66  d)<=(size_t)nBuf
34750 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d   );.      nBuf =
34760 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a   sizeof(t) + siz
34770 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69  eof(randomnessPi
34780 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
34790 20 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f       do{ got = o
347a0 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20  sRead(fd, zBuf, 
347b0 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 67  nBuf); }while( g
347c0 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
347d0 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f  INTR );.      ro
347e0 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
347f0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
34800 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
34810 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a  return nBuf;.}..
34820 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
34830 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
34840 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
34850 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
34860 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  t..** The argume
34870 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  nt is the number
34880 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
34890 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65   we want to slee
348a0 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  p..** The return
348b0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
348c0 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
348d0 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63  onds of sleep ac
348e0 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73  tually.** reques
348f0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64  ted from the und
34900 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e  erlying operatin
34910 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62  g system, a numb
34920 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68  er which.** migh
34930 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
34940 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
34950 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20  e argument, but 
34960 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e  not less.** than
34970 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
34980 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
34990 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  xSleep(sqlite3_v
349a0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
349b0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a   microseconds){.
349c0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
349d0 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
349e0 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65   sp;..  sp.tv_se
349f0 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  c = microseconds
34a00 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70   / 1000000;.  sp
34a10 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72  .tv_nsec = (micr
34a20 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30  oseconds % 10000
34a30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61  00) * 1000;.  na
34a40 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c  nosleep(&sp, NUL
34a50 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  L);.  UNUSED_PAR
34a60 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
34a70 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73  .  return micros
34a80 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65  econds;.#elif de
34a90 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45  fined(HAVE_USLEE
34aa0 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45  P) && HAVE_USLEE
34ab0 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f  P.  usleep(micro
34ac0 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
34ad0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
34ae0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
34af0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
34b00 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64  lse.  int second
34b10 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  s = (microsecond
34b20 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30  s+999999)/100000
34b30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e  0;.  sleep(secon
34b40 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
34b50 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
34b60 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e  ;.  return secon
34b70 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64  ds*1000000;.#end
34b80 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  if.}../*.** The 
34b90 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
34ba0 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
34bb0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
34bc0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
34bd0 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
34be0 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
34bf0 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
34c00 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
34c10 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
34c20 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
34c30 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
34c40 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
34c50 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
34c60 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
34c70 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
34c80 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
34c90 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
34ca0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
34cb0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
34cc0 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
34cd0 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
34ce0 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
34cf0 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74  into *piNow.** t
34d00 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
34d10 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
34d20 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
34d30 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30  times 86_400_000
34d40 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77  .  In.** other w
34d50 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f  ords, write into
34d60 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62   *piNow the numb
34d70 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
34d80 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c  ds since the Jul
34d90 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20  ian.** epoch of 
34da0 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63  noon in Greenwic
34db0 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34  h on November 24
34dc0 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72  , 4714 B.C accor
34dd0 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70  ding to the.** p
34de0 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69  roleptic Gregori
34df0 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a  an calendar..**.
34e00 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
34e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
34e20 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
34e30 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d  ERROR if the tim
34e40 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63  e and date .** c
34e50 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
34e60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
34e70 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
34e80 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
34e90 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33  NotUsed, sqlite3
34ea0 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
34eb0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
34ec0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
34ed0 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
34ee0 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
34ef0 29 38 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20  )8640000;.  int 
34f00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34f10 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47  #if defined(NO_G
34f20 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20  ETTOD).  time_t 
34f30 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20  t;.  time(&t);. 
34f40 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69   *piNow = ((sqli
34f50 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30  te3_int64)t)*100
34f60 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23  0 + unixEpoch;.#
34f70 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  elif OS_VXWORKS.
34f80 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
34f90 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f  c sNow;.  clock_
34fa0 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45  gettime(CLOCK_RE
34fb0 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a  ALTIME, &sNow);.
34fc0 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
34fd0 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
34fe0 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
34ff0 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
35000 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23  _nsec/1000000;.#
35010 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69  else.  struct ti
35020 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 28 76  meval sNow;.  (v
35030 6f 69 64 29 67 65 74 74 69 6d 65 6f 66 64 61 79  oid)gettimeofday
35040 28 26 73 4e 6f 77 2c 20 30 29 3b 20 20 2f 2a 20  (&sNow, 0);  /* 
35050 43 61 6e 6e 6f 74 20 66 61 69 6c 20 67 69 76 65  Cannot fail give
35060 6e 20 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  n valid argument
35070 73 20 2a 2f 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  s */.  *piNow = 
35080 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
35090 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
350a0 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
350b0 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b  ow.tv_usec/1000;
350c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
350d0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
350e0 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
350f0 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
35100 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
35110 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
35120 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
35130 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
35140 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
35150 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
35160 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ed);.  return rc
35170 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
35180 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
35190 54 45 44 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  TED./*.** Find t
351a0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
351b0 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
351c0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
351d0 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
351e0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
351f0 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
35200 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
35210 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
35220 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
35230 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
35240 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
35250 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
35260 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
35270 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
35280 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75  fs *NotUsed, dou
35290 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73  ble *prNow){.  s
352a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d  qlite3_int64 i =
352b0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
352c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
352d0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 63 20  (NotUsed);.  rc 
352e0 3d 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  = unixCurrentTim
352f0 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20  eInt64(0, &i);. 
35300 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
35310 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e  0000.0;.  return
35320 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64   rc;.}.#else.# d
35330 65 66 69 6e 65 20 75 6e 69 78 43 75 72 72 65 6e  efine unixCurren
35340 74 54 69 6d 65 20 30 0a 23 65 6e 64 69 66 0a 0a  tTime 0.#endif..
35350 2f 2a 0a 2a 2a 20 54 68 65 20 78 47 65 74 4c 61  /*.** The xGetLa
35360 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64  stError() method
35370 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
35380 72 65 74 75 72 6e 20 61 20 62 65 74 74 65 72 0a  return a better.
35390 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72  ** low-level err
353a0 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
353b0 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d  operating-system
353c0 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75   problems come u
353d0 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69  p.** during SQLi
353e0 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4f  te operation.  O
353f0 6e 6c 79 20 74 68 65 20 69 6e 74 65 67 65 72 20  nly the integer 
35400 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 63  return code is c
35410 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  urrently.** used
35420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35430 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
35440 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
35450 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
35460 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73  ed2, char *NotUs
35470 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed3){.  UNUSED_P
35480 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
35490 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
354a0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b  METER(NotUsed2);
354b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
354c0 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20  TER(NotUsed3);. 
354d0 20 72 65 74 75 72 6e 20 65 72 72 6e 6f 3b 0a 7d   return errno;.}
354e0 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../*.**********
354f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
35500 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  nd of sqlite3_vf
35510 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
35520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35530 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
35540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35580 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
35590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
355a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
355b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
355c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
355d0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
355e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
355f0 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f  * Begin Proxy Lo
35600 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
35610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35620 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f  ******.**.** Pro
35630 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20  xy locking is a 
35640 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65  "uber-locking-me
35650 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65  thod" in this se
35660 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68  nse:  It uses th
35670 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  e.** other locki
35680 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65  ng methods on se
35690 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c  condary lock fil
356a0 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69  es.  Proxy locki
356b0 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d  ng is a.** meta-
356c0 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f  layer over top o
356d0 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  f the primitive 
356e0 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
356f0 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a  ted above.  For.
35700 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  ** this reason, 
35710 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
35720 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20  t implements of 
35730 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
35740 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74   deferred.** unt
35750 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66  il late in the f
35760 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72  ile (here) after
35770 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65   all of the othe
35780 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61  r I/O methods ha
35790 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e  ve.** been defin
357a0 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65  ed - so that the
357b0 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
357c0 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61  ng methods are a
357d0 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73  vailable.** as s
357e0 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20  ervices to help 
357f0 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65  with the impleme
35800 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79  ntation of proxy
35810 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a   locking..**.***
35820 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  *.**.** The defa
35830 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  ult locking sche
35840 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73  mes in SQLite us
35850 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
35860 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ks on the.** dat
35870 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f  abase file to co
35880 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63  ordinate safe, c
35890 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73  oncurrent access
358a0 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61   by multiple rea
358b0 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74  ders.** and writ
358c0 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69  ers [http://sqli
358d0 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33  te.org/lockingv3
358e0 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76  .html].  The fiv
358f0 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a  e file locking.*
35900 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b  * states (UNLOCK
35910 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41  ED, PENDING, SHA
35920 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45  RED, RESERVED, E
35930 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d  XCLUSIVE) are im
35940 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20  plemented.** as 
35950 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69  POSIX read & wri
35960 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69  te locks over fi
35970 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74  xed set of locat
35980 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29  ions (via fsctl)
35990 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20  ,.** on AFP and 
359a0 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69  SMB only exclusi
359b0 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  ve byte-range lo
359c0 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  cks are availabl
359d0 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77  e via fsctl.** w
359e0 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32  ith _IOWR('z', 2
359f0 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
35a00 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74  ngeLockPB2) to t
35a10 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20  rack the same 5 
35a20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69  states..** To si
35a30 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b  mulate a F_RDLCK
35a40 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   on the shared r
35a50 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72  ange, on AFP a r
35a60 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64  andomly selected
35a70 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74  .** address in t
35a80 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  he shared range 
35a90 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53  is taken for a S
35aa0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
35ab0 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64  entire.** shared
35ac0 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
35ad0 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  for an EXCLUSIVE
35ae0 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   lock):.**.**   
35af0 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20     PENDING_BYTE 
35b00 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
35b10 30 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56  0.**      RESERV
35b20 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78  ED_BYTE       0x
35b30 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20  40000001.**     
35b40 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20   SHARED_RANGE   
35b50 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20       0x40000002 
35b60 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a  -> 0x40000200.**
35b70 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77  .** This works w
35b80 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ell on the local
35b90 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75   file system, bu
35ba0 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79  t shows a nearly
35bb0 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77   100x.** slowdow
35bc0 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72  n in read perfor
35bd0 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63  mance on AFP bec
35be0 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69  ause the AFP cli
35bf0 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20  ent disables.** 
35c00 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77  the read cache w
35c10 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  hen byte-range l
35c20 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74  ocks are present
35c30 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20  .  Enabling the 
35c40 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78  read.** cache ex
35c50 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f  poses a cache co
35c60 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20  herency problem 
35c70 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20  that is present 
35c80 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73  on all OS X.** s
35c90 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b  upported network
35ca0 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20   file systems.  
35cb0 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68  NFS and AFP both
35cc0 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20   observe the.** 
35cd0 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65  close-to-open se
35ce0 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75  mantics for ensu
35cf0 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72  ring cache coher
35d00 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f  ency.** [http://
35d10 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e  nfs.sourceforge.
35d20 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68  net/#faq_a8], wh
35d30 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66  ich does not eff
35d40 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72  ectively.** addr
35d50 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d  ess the requirem
35d60 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72  ents for concurr
35d70 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63  ent database acc
35d80 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a  ess by multiple.
35d90 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  ** readers and w
35da0 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a  riters.** [http:
35db0 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d  //www.nabble.com
35dc0 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63  /SQLite-on-NFS-c
35dd0 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74  ache-coherency-t
35de0 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e  d15655701.html].
35df0 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73  .**.** To addres
35e00 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  s the performanc
35e10 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65  e and cache cohe
35e20 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72  rency issues, pr
35e30 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
35e40 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20  .** changes the 
35e50 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63  way database acc
35e60 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65  ess is controlle
35e70 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63  d by limiting ac
35e80 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e  cess to a.** sin
35e90 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69  gle host at a ti
35ea0 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69  me and moving fi
35eb0 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20  le locks off of 
35ec0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35ed0 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20  e.** and onto a 
35ee0 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68  proxy file on th
35ef0 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
35f00 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  tem.  .**.**.** 
35f10 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b  Using proxy lock
35f20 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
35f30 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41  ------.**.** C A
35f40 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  PIs.**.**  sqlit
35f50 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
35f60 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
35f70 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43  TE_FCNTL_SET_LOC
35f80 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
35f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35fa0 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68       <proxy_path
35fb0 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a  > | ":auto:");.*
35fc0 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
35fd0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
35fe0 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  me, SQLITE_FCNTL
35ff0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
36000 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  LE,.**          
36010 20 20 20 20 20 20 20 20 20 20 20 20 20 26 3c 70               &<p
36020 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a  roxy_path>);.**.
36030 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61  **.** SQL pragma
36040 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  s.**.**  PRAGMA 
36050 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
36060 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78  proxy_file=<prox
36070 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a  y_path> | :auto:
36080 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
36090 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
360a0 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65  y_file.**.** Spe
360b0 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22  cifying ":auto:"
360c0 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
360d0 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20  here is a conch 
360e0 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63  file with a matc
360f0 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20  hing.** host ID 
36100 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79  in it, the proxy
36110 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e   path in the con
36120 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
36130 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a  used, otherwise.
36140 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20  ** a proxy path 
36150 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65  based on the use
36160 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20  r's temp dir.** 
36170 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53  (via confstr(_CS
36180 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
36190 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c  P_DIR,...)) will
361a0 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65   be used and the
361b0 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79  .** actual proxy
361c0 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65   file name is ge
361d0 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
361e0 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f   name and path o
361f0 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
36200 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61  e file.  For exa
36210 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
36220 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70    For database p
36230 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66  ath "/Users/me/f
36240 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20  oo.db" .**      
36250 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77   The lock path w
36260 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e  ill be "<tmpdir>
36270 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55  /sqliteplocks/_U
36280 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61  sers_me_foo.db:a
36290 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63  uto:").**.** Onc
362a0 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69  e a lock proxy i
362b0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  s configured for
362c0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
362d0 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e  ection, it can n
362e0 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64  ot.** be removed
362f0 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79  , however it may
36300 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20   be switched to 
36310 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78  a different prox
36320 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68  y path via.** th
36330 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73  e above APIs (as
36340 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68  suming the conch
36350 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69   file is not bei
36360 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ng held by anoth
36370 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  er.** connection
36380 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a   or process). .*
36390 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78  *.**.** How prox
363a0 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a  y locking works.
363b0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
363c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
363d0 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   Proxy file lock
363e0 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61  ing relies prima
363f0 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20  rily on two new 
36400 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73  supporting files
36410 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f  : .**.**   *  co
36420 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69  nch file to limi
36430 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  t access to the 
36440 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
36450 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a   a single host.*
36460 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65  *      at a time
36470 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78  .**.**   *  prox
36480 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73  y file to act as
36490 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65   a proxy for the
364a0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
364b0 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20  normally.**     
364c0 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
364d0 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65  tabase.**.** The
364e0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f   conch file - to
364f0 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c   use a proxy fil
36500 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66  e, sqlite must f
36510 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63  irst "hold the c
36520 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69  onch".** by taki
36530 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79  ng an sqlite-sty
36540 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f  le shared lock o
36550 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
36560 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a  , reading the.**
36570 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f   contents and co
36580 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74  mparing the host
36590 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49  's unique host I
365a0 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e  D (see below) an
365b0 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20  d lock.** proxy 
365c0 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65  path against the
365d0 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
365e0 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68  n the conch.  Th
365f0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a  e conch file is.
36600 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
36610 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
36620 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
36630 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
36640 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74  e name.** is pat
36650 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65  terned after the
36660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
36670 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61  ame as ".<databa
36680 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a  sename>-conch"..
36690 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20  ** If the conch 
366a0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
366b0 69 73 74 2c 20 6f 72 20 69 74 73 20 63 6f 6e 74  ist, or its cont
366c0 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ents do not matc
366d0 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44  h the.** host ID
366e0 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61   and/or proxy pa
366f0 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  th, then the loc
36700 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74  k is escalated t
36710 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a  o an exclusive.*
36720 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63  * lock and the c
36730 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e  onch file conten
36740 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ts is updated wi
36750 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  th the host ID a
36760 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68  nd proxy.** path
36770 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73   and the lock is
36780 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
36790 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61   shared lock aga
367a0 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63  in.  If the conc
367b0 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20  h.** is held by 
367c0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
367d0 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c  (with a shared l
367e0 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73  ock), the exclus
367f0 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c  ive lock.** will
36800 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45   fail and SQLITE
36810 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
36820 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  d..**.** The pro
36830 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67  xy file - a sing
36840 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65  le-byte file use
36850 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f  d for all adviso
36860 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a  ry file locks.**
36870 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20   normally taken 
36880 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36890 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c  file.   This all
368a0 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61  ows for safe sha
368b0 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ring.** of the d
368c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
368d0 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
368e0 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e  s and writers on
368f0 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73   the same.** hos
36900 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73  t (the conch ens
36910 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61  ures that they a
36920 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ll use the same 
36930 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29  local lock file)
36940 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69  ..**.** Requesti
36950 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78  ng the lock prox
36960 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64  y does not immed
36970 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20  iately take the 
36980 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20  conch, it is.** 
36990 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20  only taken when 
369a0 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73  the first reques
369b0 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61  t to lock databa
369c0 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e  se file is made.
369d0 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68    .** This match
369e0 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73  es the semantics
369f0 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f   of the traditio
36a00 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61  nal locking beha
36a10 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f  vior, where.** o
36a20 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74  pening a connect
36a30 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73  ion to a databas
36a40 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
36a50 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69  take a lock on i
36a60 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64  t..** The shared
36a70 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65   lock and an ope
36a80 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
36a90 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64  r are maintained
36aa0 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63   until .** the c
36ab0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
36ac0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f   database is clo
36ad0 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sed. .**.** The 
36ae0 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74  proxy file and t
36af0 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65  he lock file are
36b00 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73   never deleted s
36b10 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64  o they only need
36b20 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65  .** to be create
36b30 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  d the first time
36b40 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a   they are used..
36b50 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74  **.** Configurat
36b60 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d  ion options.** -
36b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b80 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49  ----.**.**  SQLI
36b90 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
36ba0 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LOCKING.**.**   
36bb0 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
36bc0 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e  es accessed on n
36bd0 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  on-local file sy
36be0 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20  stems are.**    
36bf0 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79     automatically
36c00 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
36c10 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c  proxy locking, l
36c20 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a  ock files are.**
36c30 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74         named aut
36c40 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67  omatically using
36c50 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20   the same logic 
36c60 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47  as.**       PRAG
36c70 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  MA lock_proxy_fi
36c80 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20  le=":auto:".**  
36c90 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52    .**  SQLITE_PR
36ca0 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20  OXY_DEBUG.**.** 
36cb0 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68        Enables th
36cc0 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72  e logging of err
36cd0 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69  or messages duri
36ce0 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a  ng host id file.
36cf0 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76  **       retriev
36d00 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a  al and creation.
36d10 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59  **.**  LOCKPROXY
36d20 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  DIR.**.**       
36d30 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65  Overrides the de
36d40 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20  fault directory 
36d50 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72  used for lock pr
36d60 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a  oxy files that.*
36d70 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65  *       are name
36d80 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
36d90 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22  via the ":auto:"
36da0 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20   setting.**.**  
36db0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
36dc0 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
36dd0 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ONS.**.**       
36de0 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75  Permissions to u
36df0 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  se when creating
36e00 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72   a directory for
36e10 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20   storing the.** 
36e20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79        lock proxy
36e30 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65   files, only use
36e40 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59  d when LOCKPROXY
36e50 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a  DIR is not set..
36e60 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a  **    .**    .**
36e70 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62   As mentioned ab
36e80 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c  ove, when compil
36e90 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50  ed with SQLITE_P
36ea0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
36eb0 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20  ING,.** setting 
36ec0 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  the environment 
36ed0 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f  variable SQLITE_
36ee0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
36ef0 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a  ING to 1 will.**
36f00 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63   force proxy loc
36f10 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20  king to be used 
36f20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61  for every databa
36f30 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20  se file opened, 
36f40 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f  and 0.** will fo
36f50 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72  rce automatic pr
36f60 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62  oxy locking to b
36f70 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61  e disabled for a
36f80 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ll database.** f
36f90 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 6c 79  iles (explicitly
36fa0 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c   calling the SQL
36fb0 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f  ITE_FCNTL_SET_LO
36fc0 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67  CKPROXYFILE prag
36fd0 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f  ma or.** sqlite_
36fe0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49  file_control API
36ff0 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64   is not affected
37000 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45   by SQLITE_FORCE
37010 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e  _PROXY_LOCKING).
37020 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79  .*/../*.** Proxy
37030 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
37040 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
37050 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66  cOSX .*/.#if def
37060 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
37070 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
37080 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a  _LOCKING_STYLE..
37090 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c  /*.** The proxyL
370a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61  ockingContext ha
370b0 73 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66  s the path and f
370c0 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ile structures f
370d0 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a  or the remote .*
370e0 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78  * and local prox
370f0 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f  y files in it.*/
37100 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
37110 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
37120 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  ext proxyLocking
37130 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
37140 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
37150 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ext {.  unixFile
37160 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20   *conchFile;    
37170 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
37180 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ch file */.  cha
37190 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  r *conchFilePath
371a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
371b0 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66  e of the conch f
371c0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
371d0 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20  e *lockProxy;   
371e0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72        /* Open pr
371f0 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
37200 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f  .  char *lockPro
37210 78 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  xyPath;         
37220 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
37230 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a  roxy lock file *
37240 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68  /.  char *dbPath
37250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37260 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
37270 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69  open file */.  i
37280 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20  nt conchHeld;   
37290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
372a0 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
372b0 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63   held, -1 if loc
372c0 6b 6c 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  kless */.  int n
372d0 46 61 69 6c 73 3b 20 20 20 20 20 20 20 20 20 20  Fails;          
372e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
372f0 72 20 6f 66 20 63 6f 6e 63 68 20 74 61 6b 69 6e  r of conch takin
37300 67 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  g failures */.  
37310 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67  void *oldLocking
37320 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20  Context;     /* 
37330 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  Original locking
37340 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f  context to resto
37350 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20  re on close */. 
37360 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
37370 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d  ods const *pOldM
37380 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72  ethod;     /* Or
37390 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f  iginal I/O metho
373a0 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a  ds for close */.
373b0 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70  };../* .** The p
373c0 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70  roxy lock file p
373d0 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61  ath for the data
373e0 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69  base at dbPath i
373f0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c  s written into l
37400 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20  Path, .** which 
37410 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61  must point to va
37420 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65  lid, writable me
37430 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67  mory large enoug
37440 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c  h for a maxLen l
37450 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61  ength.** file pa
37460 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  th. .*/.static i
37470 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50  nt proxyGetLockP
37480 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
37490 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50  dbPath, char *lP
374a0 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c  ath, size_t maxL
374b0 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  en){.  int len;.
374c0 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69    int dbLen;.  i
374d0 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f  nt i;..#ifdef LO
374e0 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e  CKPROXYDIR.  len
374f0 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
37500 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20  , LOCKPROXYDIR, 
37510 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23  maxLen);.#else.#
37520 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49   ifdef _CS_DARWI
37530 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a  N_USER_TEMP_DIR.
37540 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e    {.    if( !con
37550 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
37560 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c  USER_TEMP_DIR, l
37570 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b  Path, maxLen) ){
37580 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
37590 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61  "GETLOCKPATH  fa
375a0 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64  iled %s errno=%d
375b0 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
375c0 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68             lPath
375d0 2c 20 65 72 72 6e 6f 2c 20 6f 73 47 65 74 70 69  , errno, osGetpi
375e0 64 28 30 29 29 29 3b 0a 20 20 20 20 20 20 72 65  d(0)));.      re
375f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
37600 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  R_LOCK;.    }.  
37610 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28    len = strlcat(
37620 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c  lPath, "sqlitepl
37630 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20  ocks", maxLen); 
37640 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20     .  }.# else. 
37650 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c   len = strlcpy(l
37660 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d  Path, "/tmp/", m
37670 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a  axLen);.# endif.
37680 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50  #endif..  if( lP
37690 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20  ath[len-1]!='/' 
376a0 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  ){.    len = str
376b0 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c  lcat(lPath, "/",
376c0 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20   maxLen);.  }.  
376d0 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20  .  /* transform 
376e0 74 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61  the db path to a
376f0 20 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61   unique cache na
37700 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20  me */.  dbLen = 
37710 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61  (int)strlen(dbPa
37720 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b  th);.  for( i=0;
37730 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c   i<dbLen && (i+l
37740 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65  en+7)<(int)maxLe
37750 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  n; i++){.    cha
37760 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b  r c = dbPath[i];
37770 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e  .    lPath[i+len
37780 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27  ] = (c=='/')?'_'
37790 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b  :c;.  }.  lPath[
377a0 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73  i+len]='\0';.  s
377b0 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a  trlcat(lPath, ":
377c0 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b  auto:", maxLen);
377d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54  .  OSTRACE(("GET
377e0 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
377f0 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
37800 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 6f  =%d\n", lPath, o
37810 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
37820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37830 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65  ;.}../* . ** Cre
37840 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69  ates the lock fi
37850 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69  le and any missi
37860 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69  ng directories i
37870 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73  n lockPath. */.s
37880 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
37890 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f  reateLockPath(co
378a0 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  nst char *lockPa
378b0 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65  th){.  int i, le
378c0 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41  n;.  char buf[MA
378d0 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74  XPATHLEN];.  int
378e0 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20   start = 0;.  . 
378f0 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68   assert(lockPath
37900 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72  !=NULL);.  /* tr
37910 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20  y to create all 
37920 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
37930 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a   directories */.
37940 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72    len = (int)str
37950 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  len(lockPath);. 
37960 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61   buf[0] = lockPa
37970 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d  th[0];.  for( i=
37980 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b  1; i<len; i++ ){
37990 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74  .    if( lockPat
379a0 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28  h[i] == '/' && (
379b0 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29  i - start > 0) )
379c0 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20  {.      /* only 
379d0 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69  mkdir if leaf di
379e0 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20  r != "." or "/" 
379f0 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20  or ".." */.     
37a00 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c   if( i-start>2 |
37a10 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26  | (i-start==1 &&
37a20 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
37a30 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  .' && buf[start]
37a40 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20   != '/') .      
37a50 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d     || (i-start==
37a60 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  2 && buf[start] 
37a70 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
37a80 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29  art+1] != '.') )
37a90 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d  {.        buf[i]
37aa0 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\0';.        i
37ab0 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20  f( osMkdir(buf, 
37ac0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
37ad0 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
37ae0 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ONS) ){.        
37af0 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
37b00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
37b10 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20  rr!=EEXIST ) {. 
37b20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
37b30 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
37b40 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61  ATH  FAILED crea
37b50 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20  ting %s, ".     
37b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b70 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b  "'%s' proxy lock
37b80 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
37b90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
37ba0 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74           buf, st
37bb0 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63  rerror(err), loc
37bc0 6b 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28  kPath, osGetpid(
37bd0 30 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  0)));.          
37be0 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20    return err;.  
37bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37c00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
37c10 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20    start=i+1;.   
37c20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20   }.    buf[i] = 
37c30 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d  lockPath[i];.  }
37c40 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45  .  OSTRACE(("CRE
37c50 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  ATELOCKPATH  pro
37c60 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
37c70 70 69 64 3d 25 64 5c 6e 22 2c 6c 6f 63 6b 50 61  pid=%d\n",lockPa
37c80 74 68 2c 6f 73 47 65 74 70 69 64 28 30 29 29 29  th,osGetpid(0)))
37c90 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
37ca0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
37cb0 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64 65 73  new VFS file des
37cc0 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20  criptor (stored 
37cd0 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
37ce0 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
37cf0 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f  e3_malloc) and o
37d00 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  pen the file nam
37d10 65 64 20 22 70 61 74 68 22 20 69 6e 20 74 68 65  ed "path" in the
37d20 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
37d30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
37d40 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
37d50 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63  e not only for c
37d60 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  losing the file 
37d70 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75  descriptor.** bu
37d80 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69  t also for freei
37d90 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73  ng the memory as
37da0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
37db0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
37dc0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
37dd0 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
37de0 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20  File(.    const 
37df0 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
37e00 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74     /* path for t
37e10 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20  he new unixFile 
37e20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  */.    unixFile 
37e30 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20  **ppFile,       
37e40 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61  /* unixFile crea
37e50 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  ted and returned
37e60 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69   by ref */.    i
37e70 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20  nt islockfile   
37e80 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f          /* if no
37e90 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64  n zero missing d
37ea0 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61  irs will be crea
37eb0 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74  ted */.) {.  int
37ec0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78   fd = -1;.  unix
37ed0 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
37ee0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37ef0 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
37f00 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
37f10 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
37f20 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
37f30 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
37f40 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
37f50 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
37f60 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
37f70 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
37f80 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
37f90 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
37fa0 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
37fb0 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
37fc0 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
37fd0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
37fe0 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
37ff0 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
38000 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
38010 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
38020 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
38030 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
38040 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
38050 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
38060 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
38070 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
38080 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
38090 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
380a0 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
380b0 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
380c0 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
380d0 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
380e0 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
380f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
38100 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  c64(sizeof(*pUnu
38110 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21  sed));.    if( !
38120 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
38130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
38140 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
38150 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
38160 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ){.    fd = robu
38170 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
38180 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
38190 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
381a0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
381b0 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
381c0 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
381d0 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
381e0 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
381f0 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
38200 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
38210 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
38220 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
38230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
38240 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
38250 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20  {.    openFlags 
38260 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
38270 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
38280 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
38290 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  , 0);.    terrno
382a0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
382b0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
382c0 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29  if( islockfile )
382d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
382e0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
382f0 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 65  }.    switch (te
38300 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61  rrno) {.      ca
38310 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20  se EACCES:.     
38320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
38330 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73  _PERM;.      cas
38340 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20  e EIO: .        
38350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
38360 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65  ERR_LOCK; /* eve
38370 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 74  n though it is t
38380 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20  he conch */.    
38390 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
383a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
383b0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
383c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70      }.  }.  .  p
383d0 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
383e0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
383f0 36 34 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  64(sizeof(*pNew)
38400 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e  );.  if( pNew==N
38410 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
38420 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
38430 54 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  T;.    goto end_
38440 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20  create_proxy;.  
38450 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  }.  memset(pNew,
38460 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
38470 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  ile));.  pNew->o
38480 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
38490 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26  lags;.  memset(&
384a0 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a  dummyVfs, 0, siz
384b0 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a  eof(dummyVfs));.
384c0 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44    dummyVfs.pAppD
384d0 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75  ata = (void*)&au
384e0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a  tolockIoFinder;.
384f0 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65    dummyVfs.zName
38500 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55   = "dummy";.  pU
38510 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
38520 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73    pUnused->flags
38530 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
38540 70 4e 65 77 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  pNew->pPrealloca
38550 74 65 64 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  tedUnused = pUnu
38560 73 65 64 3b 0a 20 20 0a 20 20 72 63 2