/ Hex Artifact Content
Login

Artifact 7cc36e2b1c3bc45cab3f4af4b9ef498a5ba14c60edc71bdce8c712ce78abdc24:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0ce0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
0cf0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0d00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0d30: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64  <errno.h>.#if !d
0d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
0d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
0d70: 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  0.# include <sys
0d80: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
0d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
0da0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0db0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0dc0: 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ioctl.h>.# inclu
0dd0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
0de0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70  # include <sys/p
0df0: 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  aram.h>.#endif /
0e00: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
0e10: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
0e20: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0e30: 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f  APPLE__) && ((__
0e40: 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
0e50: 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20  _MIN_REQUIRED > 
0e60: 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20  1050) || \.     
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f        (__IPHONE_
0e90: 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  OS_VERSION_MIN_R
0ea0: 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29 29  EQUIRED > 2000))
0eb0: 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65 64  .#  if (!defined
0ec0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0ed0: 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54 5f  DED) || (TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29 29  OS_EMBEDDED==0))
0ef0: 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21 64   \.       && (!d
0f00: 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49 50  efined(TARGET_IP
0f10: 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29 20  HONE_SIMULATOR) 
0f20: 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f 4e  || (TARGET_IPHON
0f30: 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29 29  E_SIMULATOR==0))
0f40: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41 56  .#    define HAV
0f50: 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a  E_GETHOSTUUID 1.
0f60: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61 72  #  else.#    war
0f70: 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75 69  ning "gethostuui
0f80: 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2e  d() is disabled.
0f90: 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ".#  endif.#endi
0fa0: 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  f...#if OS_VXWOR
0fb0: 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  KS.# include <sy
0fc0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63  s/ioctl.h>.# inc
0fd0: 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e  lude <semaphore.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c 69  h>.# include <li
0ff0: 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  mits.h>.#endif /
1000: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1010: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1020: 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
1030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1040: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1050: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1060: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41  endif..#ifdef HA
1070: 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75  VE_UTIME.# inclu
1080: 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e  de <utime.h>.#en
1090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
10a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
10b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
10c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
10d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
10e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
10f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1100: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1110: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1120: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1130: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1140: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1150: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1160: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1170: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1180: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1190: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
11a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
11b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
11c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
11d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
11e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1200: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1210: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1220: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1230: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1240: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
1250: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1260: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1270: 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65  xy dir.*/.#ifnde
1280: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1290: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
12a0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
12b0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
12c0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
12d0: 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a  NS 0755.#endif..
12e0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75  /*.** Maximum su
12f0: 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e  pported path-len
1300: 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  gth..*/.#define 
1310: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32  MAX_PATHNAME 512
1320: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
1330: 73 75 70 70 6f 72 74 65 64 20 73 79 6d 62 6f 6c  supported symbol
1340: 69 63 20 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65 66  ic links.*/.#def
1350: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ine SQLITE_MAX_S
1360: 59 4d 4c 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a 20  YMLINKS 100../* 
1370: 41 6c 77 61 79 73 20 63 61 73 74 20 74 68 65 20  Always cast the 
1380: 67 65 74 70 69 64 28 29 20 72 65 74 75 72 6e 20  getpid() return 
1390: 74 79 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  type for compati
13a0: 62 69 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b  bility with.** k
13b0: 65 72 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e  ernel modules in
13c0: 20 56 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65   VxWorks. */.#de
13d0: 66 69 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29  fine osGetpid(X)
13e0: 20 28 70 69 64 5f 74 29 67 65 74 70 69 64 28 29   (pid_t)getpid()
13f0: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74  ../*.** Only set
1400: 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69   the lastErrno i
1410: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
1420: 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72   is a real error
1430: 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e   and not .** a n
1440: 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72  ormal expected r
1450: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
1460: 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
1470: 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e  ITE_OK.*/.#defin
1480: 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  e IS_LOCK_ERROR(
1490: 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54  x)  ((x != SQLIT
14a0: 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53  E_OK) && (x != S
14b0: 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a  QLITE_BUSY))../*
14c0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
14d0: 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ces */.typedef s
14e0: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e  truct unixShm un
14f0: 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  ixShm;          
1500: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1510: 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
1520: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1530: 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75  ct unixShmNode u
1540: 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20  nixShmNode;     
1550: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1560: 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74  ry instance */.t
1570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1580: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78  ixInodeInfo unix
1590: 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20  InodeInfo;   /* 
15a0: 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70  An i-node */.typ
15b0: 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78  edef struct Unix
15c0: 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75  UnusedFd UnixUnu
15d0: 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e  sedFd;     /* An
15e0: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
15f0: 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a  criptor */../*.*
1600: 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74  * Sometimes, aft
1610: 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65  er a file handle
1620: 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51   is closed by SQ
1630: 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64  Lite, the file d
1640: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e  escriptor.** can
1650: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
1660: 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68  mediately. In th
1670: 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61  ese cases, insta
1680: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
1690: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
16a0: 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  re are used to s
16b0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65  tore the file de
16c0: 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77  scriptor while w
16d0: 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a  aiting for an.**
16e0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
16f0: 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20  either close or 
1700: 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72  reuse it..*/.str
1710: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1720: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1740: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1750: 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  r to close */.  
1760: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
1770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1780: 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73  gs this file des
1790: 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e  criptor was open
17a0: 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69  ed with */.  Uni
17b0: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
17c0: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  ;      /* Next u
17d0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
17e0: 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69  iptor on same fi
17f0: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
1800: 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  The unixFile str
1810: 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61  ucture is subcla
1820: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1830: 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  le specific to t
1840: 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69  he unix.** VFS i
1850: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
1860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1870: 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46  t unixFile unixF
1880: 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78  ile;.struct unix
1890: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
18a0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
18b0: 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20  t *pMethod;  /* 
18c0: 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  Always the first
18d0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
18e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74 20  /* The VFS that 
1910: 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e 69  created this uni
1920: 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49  xFile */.  unixI
1930: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1950: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1960: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1970: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19b0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
19c0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19e0: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
19f0: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1a00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  .  unsigned shor
1a10: 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b  t int ctrlFlags;
1a20: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1a30: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1a40: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1a50: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1a80: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1a90: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1aa0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1ab0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1ac0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1ad0: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1ae0: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1af0: 75 73 65 64 46 64 20 2a 70 50 72 65 61 6c 6c 6f  usedFd *pPreallo
1b00: 63 61 74 65 64 55 6e 75 73 65 64 3b 20 20 2f 2a  catedUnused;  /*
1b10: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1b20: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1b40: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1b50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b60: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1b70: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ba0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1bb0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1bc0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1bf0: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1c00: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1c10: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1c20: 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b    int nFetchOut;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c50: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  of outstanding x
1c60: 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20  Fetch refs */.  
1c70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1c80: 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  apSize;         
1c90: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
1ca0: 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74  ze of mapping at
1cb0: 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20   pMapRegion */. 
1cc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1cd0: 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20  mapSizeActual;  
1ce0: 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73       /* Actual s
1cf0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
1d00: 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  t pMapRegion */.
1d10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1d20: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
1d30: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
1d40: 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  red FCNTL_MMAP_S
1d50: 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76  IZE value */.  v
1d60: 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b  oid *pMapRegion;
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
1d90: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65  ped region */.#e
1da0: 6e 64 69 66 0a 20 20 69 6e 74 20 73 65 63 74 6f  ndif.  int secto
1db0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1dd0: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1de0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1df0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1e10: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1e20: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e30: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1e40: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e50: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1e60: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e80: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1e90: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1ea0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1eb0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1ec0: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
1ed0: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
1ee0: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c  /* cached detail
1f10: 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20  s from statfs() 
1f20: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
1f30: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
1f40: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
1f50: 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *pId;          /
1f60: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
1f70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
1f80: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1f90: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f   /* The next gro
1fa0: 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20  up of variables 
1fb0: 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63  are used to trac
1fc0: 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  k whether or not
1fd0: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
1fe0: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e  ction counter in
1ff0: 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20   bytes 24-27 of 
2000: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
2010: 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20  re updated.  ** 
2020: 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72  whenever any par
2030: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
2040: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61  e changes.  An a
2050: 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
2060: 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69  ill.  ** occur i
2070: 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61  f a file is upda
2080: 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f  ted without also
2090: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72   updating the tr
20a0: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
20b0: 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65  ounter.  This te
20c0: 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76  st is made to av
20d0: 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73  oid new problems
20e0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a   similar to the.
20f0: 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62    ** one describ
2100: 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
2110: 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69  84. .  */.  unsi
2120: 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43  gned char transC
2130: 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72  ntrChng;   /* Tr
2140: 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  ue if the transa
2150: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68  ction counter ch
2160: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
2170: 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74  ned char dbUpdat
2180: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  e;        /* Tru
2190: 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  e if any part of
21a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
21b0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
21c0: 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d  gned char inNorm
21d0: 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72  alWrite;   /* Tr
21e0: 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61  ue if in a norma
21f0: 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  l write operatio
2200: 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69  n */..#endif..#i
2210: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2220: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
2230: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
2240: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
2250: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
2260: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
2270: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
2280: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
2290: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
22a0: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
22b0: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
22c0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54  .#endif.};../* T
22d0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 6f 6c  his variable hol
22e0: 64 73 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  ds the process i
22f0: 64 20 28 70 69 64 29 20 66 72 6f 6d 20 77 68 65  d (pid) from whe
2300: 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  n the xRandomnes
2310: 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 77 61  s().** method wa
2320: 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 78 4f  s called.  If xO
2330: 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  pen() is called 
2340: 66 72 6f 6d 20 61 20 64 69 66 66 65 72 65 6e 74  from a different
2350: 20 70 72 6f 63 65 73 73 20 69 64 2c 0a 2a 2a 20   process id,.** 
2360: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2370: 61 20 66 6f 72 6b 28 29 20 68 61 73 20 6f 63 63  a fork() has occ
2380: 75 72 72 65 64 2c 20 74 68 65 20 50 52 4e 47 20  urred, the PRNG 
2390: 77 69 6c 6c 20 62 65 20 72 65 73 65 74 2e 0a 2a  will be reset..*
23a0: 2f 0a 73 74 61 74 69 63 20 70 69 64 5f 74 20 72  /.static pid_t r
23b0: 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 30  andomnessPid = 0
23c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
23d0: 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
23e0: 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61  unixFile.ctrlFla
23f0: 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23  gs bitmask:.*/.#
2400: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2410: 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31  EXCL        0x01
2420: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
2430: 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f  ons from one pro
2440: 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  cess only */.#de
2450: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44  fine UNIXFILE_RD
2460: 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20  ONLY      0x02  
2470: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2480: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
2490: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
24a0: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78  E_PERSIST_WAL 0x
24b0: 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73  04     /* Persis
24c0: 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  tent WAL mode */
24d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24e0: 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
24f0: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2500: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
2510: 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f  8     /* Directo
2520: 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a  ry sync needed *
2530: 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  /.#else.# define
2540: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2550: 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66  C    0x00.#endif
2560: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2570: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30 78  E_PSOW        0x
2580: 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  10     /* SQLITE
2590: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
25a0: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64  _OVERWRITE */.#d
25b0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
25c0: 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30 20  ELETE      0x20 
25d0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
25e0: 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e   close */.#defin
25f0: 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20  e UNIXFILE_URI  
2600: 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20 20         0x40     
2610: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68  /* Filename migh
2620: 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61 72  t have query par
2630: 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  ameters */.#defi
2640: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  ne UNIXFILE_NOLO
2650: 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20 20  CK      0x80    
2660: 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c   /* Do no file l
2670: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2680: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2690: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
26a0: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
26b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
26c0: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
26d0: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
26e0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
26f0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
2700: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
2710: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
2720: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
2730: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2750: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2760: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2770: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2780: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2790: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
27a0: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
27b0: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
27c0: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
27d0: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
27e0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
27f0: 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63  The threadid mac
2800: 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74  ro resolves to t
2810: 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20  he thread-id or 
2820: 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a  to 0.  Used for.
2830: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
2840: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2850: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
2860: 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20  EADSAFE.#define 
2870: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
2880: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
2890: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
28a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
28b0: 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66 61 75  AVE_MREMAP defau
28c0: 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c  lts to true on L
28d0: 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65 20 65  inux and false e
28e0: 76 65 72 79 77 68 65 72 65 20 65 6c 73 65 2e 0a  verywhere else..
28f0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2900: 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69  HAVE_MREMAP).# i
2910: 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  f defined(__linu
2920: 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  x__) && defined(
2930: 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23 20 20  _GNU_SOURCE).#  
2940: 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d  define HAVE_MREM
2950: 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20 20 64  AP 1.# else.#  d
2960: 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41  efine HAVE_MREMA
2970: 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  P 0.# endif.#end
2980: 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63  if../*.** Explic
2990: 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20 36 34  itly call the 64
29a0: 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  -bit version of 
29b0: 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64 72 6f  lseek() on Andro
29c0: 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c  id. Otherwise, l
29d0: 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74 68 65  seek().** is the
29e0: 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f 6e 2c   32-bit version,
29f0: 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45 5f 4f   even if _FILE_O
2a00: 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73  FFSET_BITS=64 is
2a10: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
2a20: 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a  def __ANDROID__.
2a30: 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b 20 6c  # define lseek l
2a40: 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a 0a 23  seek64.#endif..#
2a50: 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
2a60: 2f 2a 0a 2a 2a 20 4c 69 6e 75 78 2d 73 70 65 63  /*.** Linux-spec
2a70: 69 66 69 63 20 49 4f 43 54 4c 20 6d 61 67 69 63  ific IOCTL magic
2a80: 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20 66 6f   numbers used fo
2a90: 72 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 46 32  r controlling F2
2aa0: 46 53 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 32  FS.*/.#define F2
2ab0: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 20 20  FS_IOCTL_MAGIC  
2ac0: 20 20 20 20 20 20 30 78 66 35 0a 23 64 65 66 69        0xf5.#defi
2ad0: 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52  ne F2FS_IOC_STAR
2ae0: 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 20  T_ATOMIC_WRITE  
2af0: 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54     _IO(F2FS_IOCT
2b00: 4c 5f 4d 41 47 49 43 2c 20 31 29 0a 23 64 65 66  L_MAGIC, 1).#def
2b10: 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 43 4f 4d  ine F2FS_IOC_COM
2b20: 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  MIT_ATOMIC_WRITE
2b30: 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43      _IO(F2FS_IOC
2b40: 54 4c 5f 4d 41 47 49 43 2c 20 32 29 0a 23 64 65  TL_MAGIC, 2).#de
2b50: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54  fine F2FS_IOC_ST
2b60: 41 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49  ART_VOLATILE_WRI
2b70: 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f  TE   _IO(F2FS_IO
2b80: 43 54 4c 5f 4d 41 47 49 43 2c 20 33 29 0a 23 64  CTL_MAGIC, 3).#d
2b90: 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 41  efine F2FS_IOC_A
2ba0: 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52  BORT_VOLATILE_WR
2bb0: 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49  ITE   _IO(F2FS_I
2bc0: 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 35 29 0a 23  OCTL_MAGIC, 5).#
2bd0: 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f  define F2FS_IOC_
2be0: 47 45 54 5f 46 45 41 54 55 52 45 53 20 20 20 20  GET_FEATURES    
2bf0: 20 20 20 20 20 20 20 5f 49 4f 52 28 46 32 46 53         _IOR(F2FS
2c00: 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 31 32  _IOCTL_MAGIC, 12
2c10: 2c 20 75 33 32 29 0a 23 64 65 66 69 6e 65 20 46  , u32).#define F
2c20: 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d  2FS_FEATURE_ATOM
2c30: 49 43 5f 57 52 49 54 45 20 30 78 30 30 30 34 0a  IC_WRITE 0x0004.
2c40: 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75  #endif /* __linu
2c50: 78 5f 5f 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44  x__ */.../*.** D
2c60: 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79  ifferent Unix sy
2c70: 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70  stems declare op
2c80: 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e  en() in differen
2c90: 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73  t ways.  Same us
2ca0: 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20  e.** open(const 
2cb0: 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74  char*,int,mode_t
2cc0: 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f  ).  Others use o
2cd0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
2ce0: 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65  int,...)..** The
2cf0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69   difference is i
2d00: 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73  mportant when us
2d10: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2d20: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
2d30: 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20  *.** The safest 
2d40: 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68  way to deal with
2d50: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
2d60: 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  to always use th
2d70: 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68  is wrapper.** wh
2d80: 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74  ich always has t
2d90: 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66  he same well-def
2da0: 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a  ined interface..
2db0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
2dc0: 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68  sixOpen(const ch
2dd0: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66  ar *zFile, int f
2de0: 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  lags, int mode){
2df0: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a  .  return open(z
2e00: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64  File, flags, mod
2e10: 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  e);.}../* Forwar
2e20: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
2e30: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
2e40: 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
2e50: 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  ar*, int*);.stat
2e60: 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61  ic int unixGetpa
2e70: 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f  gesize(void);../
2e80: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
2e90: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
2ea0: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
2eb0: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
2ec0: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
2ed0: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
2ee0: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
2ef0: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
2f00: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
2f10: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
2f20: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
2f30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
2f40: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
2f50: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
2f60: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
2f70: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
2f80: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
2f90: 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61  truct unix_sysca
2fa0: 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ll {.  const cha
2fb0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
2fc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2fd0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
2fe0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2ff0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
3000: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
3010: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
3020: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3030: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3040: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
3050: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
3060: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20  aSyscall[] = {. 
3070: 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20   { "open",      
3080: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3090: 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65  all_ptr)posixOpe
30a0: 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  n,  0  },.#defin
30b0: 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28  e osOpen      ((
30c0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
30d0: 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73  r*,int,int))aSys
30e0: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
30f0: 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20  )..  { "close", 
3100: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3110: 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73  syscall_ptr)clos
3120: 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  e,      0  },.#d
3130: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20  efine osClose   
3140: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29    ((int(*)(int))
3150: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
3160: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65  rent)..  { "acce
3170: 73 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ss",       (sqli
3180: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3190: 61 63 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d  access,     0  }
31a0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65  ,.#define osAcce
31b0: 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  ss    ((int(*)(c
31c0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29  onst char*,int))
31d0: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
31e0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63  rent)..  { "getc
31f0: 77 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wd",       (sqli
3200: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3210: 67 65 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d  getcwd,     0  }
3220: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63  ,.#define osGetc
3230: 77 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29  wd    ((char*(*)
3240: 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61  (char*,size_t))a
3250: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
3260: 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22  ent)..  { "stat"
3270: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3280: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73  e3_syscall_ptr)s
3290: 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c  tat,       0  },
32a0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20  .#define osStat 
32b0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
32c0: 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74  nst char*,struct
32d0: 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c   stat*))aSyscall
32e0: 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f  [4].pCurrent)../
32f0: 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63  *.** The DJGPP c
3300: 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d  ompiler environm
3310: 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79  ent looks mostly
3320: 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20   like Unix, but 
3330: 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20  it.** lacks the 
3340: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
3350: 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e  all.  So redefin
3360: 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20  e fcntl() to be 
3370: 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61  something.** tha
3380: 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  t always succeed
3390: 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  s.  This means t
33a0: 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73  hat locking does
33b0: 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72   not occur under
33c0: 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20  .** DJGPP.  But 
33d0: 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74  it is DOS - what
33e0: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
33f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
3400: 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22  PP__.  { "fstat"
3410: 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20  ,        0,     
3420: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d              0  }
3430: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
3440: 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65  t(a,b,c)    0.#e
3450: 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73  lse     .  { "fs
3460: 74 61 74 22 2c 20 20 20 20 20 20 20 20 28 73 71  tat",        (sq
3470: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3480: 72 29 66 73 74 61 74 2c 20 20 20 20 20 20 30 20  r)fstat,      0 
3490: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
34a0: 74 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29  tat     ((int(*)
34b0: 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74  (int,struct stat
34c0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70  *))aSyscall[5].p
34d0: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
34e0: 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22  .  { "ftruncate"
34f0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3500: 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63  scall_ptr)ftrunc
3510: 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  ate,  0  },.#def
3520: 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20  ine osFtruncate 
3530: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66  ((int(*)(int,off
3540: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  _t))aSyscall[6].
3550: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3560: 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28  fcntl",        (
3570: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3580: 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20  ptr)fcntl,      
3590: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
35a0: 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28  Fcntl     ((int(
35b0: 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29  *)(int,int,...))
35c0: 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72  aSyscall[7].pCur
35d0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64  rent)..  { "read
35e0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
35f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3600: 72 65 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d  read,       0  }
3610: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64  ,.#define osRead
3620: 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28        ((ssize_t(
3630: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
3640: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d  e_t))aSyscall[8]
3650: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3660: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
3670: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
3680: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3690: 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20  E.  { "pread",  
36a0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
36b0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64  yscall_ptr)pread
36c0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  ,      0  },.#el
36d0: 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20  se.  { "pread", 
36e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
36f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3700: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
3710: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
3720: 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65  read     ((ssize
3730: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
3740: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
3750: 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65  yscall[9].pCurre
3760: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3770: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
3780: 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20  { "pread64",    
3790: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
37a0: 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20  ll_ptr)pread64, 
37b0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
37c0: 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20   { "pread64",   
37d0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
37e0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
37f0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3800: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3810: 36 34 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28  64 ((ssize_t(*)(
3820: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
3830: 2c 6f 66 66 36 34 5f 74 29 29 61 53 79 73 63 61  ,off64_t))aSysca
3840: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
3850: 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20  ..  { "write",  
3860: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3870: 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65  yscall_ptr)write
3880: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3890: 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20  fine osWrite    
38a0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
38b0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
38c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ze_t))aSyscall[1
38d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
38e0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
38f0: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
3900: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
3910: 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22  YLE.  { "pwrite"
3920: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3930: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3940: 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ite,     0  },.#
3950: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3960: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3970: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3980: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3990: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
39a0: 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69  sPwrite    ((ssi
39b0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
39c0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
39d0: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
39f0: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
3a00: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3a10: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b  USE_PREAD64).  {
3a20: 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20   "pwrite64",    
3a30: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3a40: 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c 20  l_ptr)pwrite64, 
3a50: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3a60: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
3a70: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3a80: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3a90: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3aa0: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
3ab0: 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  64  ((ssize_t(*)
3ac0: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3ad0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74 29  ,size_t,off64_t)
3ae0: 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
3af0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
3b00: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  13].pCurrent).. 
3b10: 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20   { "fchmod",    
3b20: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3b30: 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20  all_ptr)fchmod, 
3b40: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
3b50: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
3b60: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3b70: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3b80: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
3b90: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3ba0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3bb0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
3bc0: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
3bd0: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3be0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3bf0: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3c00: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3c10: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3c20: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c30: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3c40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c50: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3c60: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3c70: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3c80: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
3c90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3ca0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
3cb0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3cc0: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
3cd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3ce0: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3cf0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3d00: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3d10: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3d20: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3d30: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3d40: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3d50: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3d60: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3d70: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3d80: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3d90: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3da0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3db0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3dc0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3dd0: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3de0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3df0: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3e00: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3e10: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3e20: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3e30: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3e40: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3e50: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3e60: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3e70: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3e80: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3e90: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3ea0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3eb0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3ec0: 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e  ined(HAVE_FCHOWN
3ed0: 29 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20  ).  { "fchown", 
3ee0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3ef0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6f 77  yscall_ptr)fchow
3f00: 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  n,          0 },
3f10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68 6f  .#else.  { "fcho
3f20: 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wn",       (sqli
3f30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3f40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3f50: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
3f60: 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20 20 20  fine osFchown   
3f70: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69   ((int(*)(int,ui
3f80: 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79 73 63  d_t,gid_t))aSysc
3f90: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
3fa0: 29 0a 0a 20 20 7b 20 22 67 65 74 65 75 69 64 22  )..  { "geteuid"
3fb0: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
3fc0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 65  syscall_ptr)gete
3fd0: 75 69 64 2c 20 20 20 20 20 20 20 20 20 30 20 7d  uid,         0 }
3fe0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 65  ,.#define osGete
3ff0: 75 69 64 20 20 20 28 28 75 69 64 5f 74 28 2a 29  uid   ((uid_t(*)
4000: 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b  (void))aSyscall[
4010: 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  21].pCurrent)..#
4020: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4030: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
4040: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
4050: 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70  SIZE>0.  { "mmap
4060: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
4070: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
4080: 6d 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mmap,           
4090: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
40a0: 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20 20  "mmap",         
40b0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
40c0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
40d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
40e0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61 70  f.#define osMmap
40f0: 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64   ((void*(*)(void
4100: 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74  *,size_t,int,int
4110: 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ,int,off_t))aSys
4120: 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e  call[22].pCurren
4130: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
4140: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
4150: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
4160: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20  MMAP_SIZE>0.  { 
4170: 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20  "munmap",       
4180: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4190: 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20  _ptr)munmap,    
41a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
41b0: 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20  .  { "munmap",  
41c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
41d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
41e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
41f0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
4200: 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMunmap ((void*(
4210: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  *)(void*,size_t)
4220: 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43  )aSyscall[23].pC
4230: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56  urrent)..#if HAV
4240: 45 5f 4d 52 45 4d 41 50 20 26 26 20 28 21 64 65  E_MREMAP && (!de
4250: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
4260: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
4270: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
4280: 29 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20  ).  { "mremap", 
4290: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
42a0: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61  yscall_ptr)mrema
42b0: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
42c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d  .#else.  { "mrem
42d0: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
42e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
42f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4300: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
4310: 66 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28  fine osMremap ((
4320: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
4330: 69 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74  ize_t,size_t,int
4340: 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32  ,...))aSyscall[2
4350: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
4360: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4370: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
4380: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
4390: 49 5a 45 3e 30 0a 20 20 7b 20 22 67 65 74 70 61  IZE>0.  { "getpa
43a0: 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74  gesize",  (sqlit
43b0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75  e3_syscall_ptr)u
43c0: 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20  nixGetpagesize, 
43d0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
43e0: 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28  getpagesize",  (
43f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
4400: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
4410: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4420: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70 61  .#define osGetpa
4430: 67 65 73 69 7a 65 20 28 28 69 6e 74 28 2a 29 28  gesize ((int(*)(
4440: 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b 32  void))aSyscall[2
4450: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
4460: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52  f defined(HAVE_R
4470: 45 41 44 4c 49 4e 4b 29 0a 20 20 7b 20 22 72 65  EADLINK).  { "re
4480: 61 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71  adlink",     (sq
4490: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
44a0: 72 29 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20  r)readlink,     
44b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
44c0: 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20  { "readlink",   
44d0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
44e0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
44f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4500: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 52 65  dif.#define osRe
4510: 61 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74  adlink ((ssize_t
4520: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
4530: 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53  char*,size_t))aS
4540: 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72  yscall[26].pCurr
4550: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4560: 64 28 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20  d(HAVE_LSTAT).  
4570: 7b 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20  { "lstat",      
4580: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
4590: 61 6c 6c 5f 70 74 72 29 6c 73 74 61 74 2c 20 20  all_ptr)lstat,  
45a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
45b0: 73 65 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c 20  se.  { "lstat", 
45c0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
45d0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
45f0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
4600: 20 6f 73 4c 73 74 61 74 20 20 20 20 20 20 28 28   osLstat      ((
4610: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
4620: 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  r*,struct stat*)
4630: 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43  )aSyscall[27].pC
4640: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4650: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20  ined(__linux__) 
4660: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
4670: 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
4680: 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 7b  TOMIC_WRITE).  {
4690: 20 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20   "ioctl",       
46a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
46b0: 6c 6c 5f 70 74 72 29 69 6f 63 74 6c 2c 20 20 20  ll_ptr)ioctl,   
46c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
46d0: 65 0a 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 20  e.  { "ioctl",  
46e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
46f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
4700: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4710: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4720: 6f 73 49 6f 63 74 6c 20 28 28 69 6e 74 28 2a 29  osIoctl ((int(*)
4730: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
4740: 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72  yscall[28].pCurr
4750: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
4760: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
4770: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
4780: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73   */.../*.** On s
4790: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c  ome systems, cal
47a0: 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77  ls to fchown() w
47b0: 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65  ill trigger a me
47c0: 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72  ssage in a secur
47d0: 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68  ity.** log if th
47e0: 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e  ey come from non
47f0: 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e  -root processes.
4800: 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69    So avoid calli
4810: 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a  ng fchown() if.*
4820: 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e  * we are not run
4830: 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f  ning as root..*/
4840: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
4850: 73 74 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c  stFchown(int fd,
4860: 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f   uid_t uid, gid_
4870: 74 20 67 69 64 29 7b 0a 23 69 66 20 64 65 66 69  t gid){.#if defi
4880: 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e 29  ned(HAVE_FCHOWN)
4890: 0a 20 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65  .  return osGete
48a0: 75 69 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63  uid() ? 0 : osFc
48b0: 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29  hown(fd,uid,gid)
48c0: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
48d0: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
48e0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
48f0: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
4900: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
4910: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
4920: 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20  f the.** "unix" 
4930: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
4940: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
4950: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
4960: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
4970: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
4980: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
4990: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
49a0: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
49b0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
49c0: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
49d0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74  atic int unixSet
49e0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
49f0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
4a00: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
4a10: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
4a20: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
4a30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4a40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4a50: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
4a60: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
4a70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
4a80: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
4a90: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
4aa0: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
4ab0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
4ac0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
4ad0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4ae0: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
4af0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
4b00: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
4b10: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
4b20: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
4b30: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
4b40: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
4b50: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
4b60: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
4b70: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
4b80: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
4b90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4ba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4bb0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
4bc0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
4bd0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
4be0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
4bf0: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
4c00: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
4c10: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
4c20: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4c40: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4c50: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
4c60: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
4c70: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
4c80: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
4c90: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
4ca0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
4cb0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
4cc0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
4cd0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
4ce0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4cf0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4d00: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
4d10: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4d20: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
4d30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
4d40: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
4d50: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
4d60: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
4d70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
4d80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4d90: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
4da0: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
4db0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
4dc0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
4dd0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4de0: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
4df0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4e00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4e10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4e30: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
4e40: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
4e50: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
4e60: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
4e70: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
4e80: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
4e90: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
4ea0: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
4eb0: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
4ec0: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
4ed0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
4ee0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e  3_syscall_ptr un
4ef0: 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixGetSystemCall(
4f00: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
4f10: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
4f20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4f30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4f40: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
4f50: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
4f60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
4f70: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4f80: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4f90: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
4fa0: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
4fb0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
4fc0: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
4fd0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4fe0: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
4ff0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
5000: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
5010: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
5020: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
5030: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
5040: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
5050: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
5060: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
5070: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
5080: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
5090: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
50a0: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
50b0: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
50c0: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
50d0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
50e0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
50f0: 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73  har *unixNextSys
5100: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
5110: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
5120: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
5130: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
5140: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
5150: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
5160: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5170: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
5180: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
5190: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
51a0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
51b0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
51c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
51d0: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
51e0: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
51f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
5200: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
5210: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
5220: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
5230: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
5240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f  ;.}../*.** Do no
5250: 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c  t accept any fil
5260: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73  e descriptor les
5270: 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  s than this valu
5280: 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  e, in order to a
5290: 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  void.** opening 
52a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
52b0: 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70  ing file descrip
52c0: 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f  tors that are co
52d0: 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  mmonly used for 
52e0: 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
52f0: 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20  ut, output, and 
5300: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  error..*/.#ifnde
5310: 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  f SQLITE_MINIMUM
5320: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
5330: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
5340: 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45  _MINIMUM_FILE_DE
5350: 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69  SCRIPTOR 3.#endi
5360: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  f../*.** Invoke 
5370: 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d  open().  Do so m
5380: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75  ultiple times, u
5390: 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73  ntil it either s
53a0: 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61  ucceeds or.** fa
53b0: 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  ils for some rea
53c0: 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45  son other than E
53d0: 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  INTR..**.** If t
53e0: 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  he file creation
53f0: 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74   mode "m" is 0 t
5400: 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68  hen set it to th
5410: 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a  e default for.**
5420: 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65   SQLite.  The de
5430: 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f  fault is SQLITE_
5440: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
5450: 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c  MISSIONS (normal
5460: 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d  ly.** 0644) as m
5470: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73  odified by the s
5480: 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66  ystem umask.  If
5490: 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65   m is not 0, the
54a0: 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69  n.** make the fi
54b0: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
54c0: 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67   be exactly m ig
54d0: 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b  noring the umask
54e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61  ..**.** The m pa
54f0: 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20  rameter will be 
5500: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68  non-zero only wh
5510: 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c  en creating -wal
5520: 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61  , -journal,.** a
5530: 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20  nd -shm files.  
5540: 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69  We want those fi
5550: 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61  les to have *exa
5560: 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a  ctly* the same.*
5570: 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73  * permissions as
5580: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
5590: 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c  database, unadul
55a0: 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75  terated by the u
55b0: 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  mask..** In that
55c0: 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62   way, if a datab
55d0: 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d  ase file is -rw-
55e0: 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d  rw-rw or -rw-rw-
55f0: 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61  r-, and a.** tra
5600: 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73  nsaction crashes
5610: 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69   and leaves behi
5620: 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c  nd hot journals,
5630: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f   then any.** pro
5640: 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c  cess that is abl
5650: 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  e to write to th
5660: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  e database will 
5670: 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a  also be able to.
5680: 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68  ** recover the h
5690: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a  ot journals..*/.
56a0: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
56b0: 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  t_open(const cha
56c0: 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64  r *z, int f, mod
56d0: 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64  e_t m){.  int fd
56e0: 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20  ;.  mode_t m2 = 
56f0: 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44  m ? m : SQLITE_D
5700: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
5710: 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65  ISSIONS;.  while
5720: 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  (1){.#if defined
5730: 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20  (O_CLOEXEC).    
5740: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c  fd = osOpen(z,f|
5750: 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23  O_CLOEXEC,m2);.#
5760: 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73  else.    fd = os
5770: 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65  Open(z,f,m2);.#e
5780: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c  ndif.    if( fd<
5790: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
57a0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f  rrno==EINTR ) co
57b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72  ntinue;.      br
57c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
57d0: 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49  f( fd>=SQLITE_MI
57e0: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
57f0: 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20  IPTOR ) break;. 
5800: 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a     osClose(fd);.
5810: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
5820: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
5830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5840: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65   "attempt to ope
5850: 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65  n \"%s\" as file
5860: 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c   descriptor %d",
5870: 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20   z, fd);.    fd 
5880: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73  = -1;.    if( os
5890: 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  Open("/dev/null"
58a0: 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61  , f, m)<0 ) brea
58b0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e  k;.  }.  if( fd>
58c0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21  =0 ){.    if( m!
58d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
58e0: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
58f0: 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
5900: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
5910: 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73  ==0 .       && s
5920: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
5930: 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61  0.       && (sta
5940: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37  tbuf.st_mode&077
5950: 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a  7)!=m .      ){.
5960: 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64          osFchmod
5970: 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d  (fd, m);.      }
5980: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
5990: 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26  ed(FD_CLOEXEC) &
59a0: 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c  & (!defined(O_CL
59b0: 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45  OEXEC) || O_CLOE
59c0: 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63  XEC==0).    osFc
59d0: 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
59e0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
59f0: 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
5a00: 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
5a10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a   }.  return fd;.
5a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
5a30: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
5a40: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
5a50: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
5a60: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
5a70: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
5a80: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
5a90: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
5aa0: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
5ab0: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
5ac0: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
5ad0: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
5ae0: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
5af0: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
5b00: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
5b10: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5b20: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
5b30: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
5b40: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
5b50: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
5b60: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
5b70: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
5b80: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
5b90: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
5ba0: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
5bb0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
5bc0: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
5bd0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
5be0: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
5bf0: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
5c00: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
5c10: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
5c20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5c30: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
5c40: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5c50: 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
5c60: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
5c70: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
5c80: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
5c90: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
5ca0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
5cb0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
5cc0: 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69  TIC_VFS1));.}.#i
5cd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5ce0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
5cf0: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
5d00: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
5d10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
5d20: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5d30: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5d40: 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
5d50: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
5d60: 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
5d70: 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  ACE./*.** Helper
5d80: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72   function for pr
5d90: 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65  inting out trace
5da0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
5db0: 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62  m debugging.** b
5dc0: 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65  inaries. This re
5dd0: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
5de0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
5df0: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
5e00: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
5e10: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
5e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69  const char *azFi
5e30: 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65  leLock(int eFile
5e40: 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28  Lock){.  switch(
5e50: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
5e60: 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20    case NO_LOCK: 
5e70: 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20  return "NONE";. 
5e80: 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c     case SHARED_L
5e90: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
5ea0: 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52  RED";.    case R
5eb0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
5ec0: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
5ed0: 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e  .    case PENDIN
5ee0: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
5ef0: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61  PENDING";.    ca
5f00: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
5f10: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
5f20: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
5f30: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
5f40: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
5f50: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
5f60: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
5f70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
5f80: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
5f90: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
5fa0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5fb0: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
5fc0: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
5fd0: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
5fe0: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
5ff0: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
6000: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
6010: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
6020: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
6030: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
6040: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
6050: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
6060: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
6070: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
6080: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
6090: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
60a0: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
60b0: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
60c0: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
60d0: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
60e0: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
60f0: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
6100: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
6110: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
6120: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
6130: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
6140: 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e  e{.    s = osFcn
6150: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
6160: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
6170: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
6180: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
6190: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
61a0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
61b0: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
61c0: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
61d0: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
61e0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
61f0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
6200: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
6210: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
6220: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
6230: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
6240: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
6250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6260: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
6270: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
6280: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
6290: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
62a0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
62b0: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
62c0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
62d0: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
62e0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
62f0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
6300: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
6310: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
6320: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
6330: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
6340: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
6350: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
6360: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
6370: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
6380: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
6390: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
63a0: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
63b0: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
63c0: 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  p;.    osFcntl(f
63d0: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
63e0: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
63f0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
6400: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
6410: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
6420: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
6430: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
6440: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
6450: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6460: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
6470: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
6480: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
6490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
64a0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
64b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
64c0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
64d0: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
64e0: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
64f0: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
6500: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
6510: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
6520: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
6530: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
6540: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
6550: 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63  s;.}.#undef osFc
6560: 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  ntl.#define osFc
6570: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
6580: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
6590: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  OCK_TRACE */../*
65a0: 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63  .** Retry ftrunc
65b0: 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ate() calls that
65c0: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
65d0: 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c  TR.**.** All cal
65e0: 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74 65 28  ls to ftruncate(
65f0: 29 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 69  ) within this fi
6600: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64  le should be mad
6610: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69  e through.** thi
6620: 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e 20 74  s wrapper.  On t
6630: 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61 74 66  he Android platf
6640: 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67 20 74  orm, bypassing t
6650: 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a  he logic below.*
6660: 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  * could lead to 
6670: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
6680: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6690: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
66a0: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
66b0: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
66c0: 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f  nt rc;.#ifdef __
66d0: 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f  ANDROID__.  /* O
66e0: 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e  n Android, ftrun
66f0: 63 61 74 65 28 29 20 61 6c 77 61 79 73 20 75 73  cate() always us
6700: 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73 65 74  es 32-bit offset
6710: 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a  s, even if .  **
6720: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
6730: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
6740: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 74 20  . This means it 
6750: 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61 74 74  is unsafe to att
6760: 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75  empt to.  ** tru
6770: 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
6780: 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65 72 20  any size larger 
6790: 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e  than 2GiB. Silen
67a0: 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20  tly ignore any. 
67b0: 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d 70 74   ** such attempt
67c0: 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e  s.  */.  if( sz>
67d0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30  (sqlite3_int64)0
67e0: 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20 20 20  x7FFFFFFF ){.   
67f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6800: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
6810: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
6820: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
6830: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
6840: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
6850: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6860: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6870: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
6880: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
6890: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
68a0: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
68b0: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
68c0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
68d0: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
68e0: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
68f0: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
6900: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
6910: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
6920: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
6930: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
6940: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
6950: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
6960: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
6970: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
6980: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
6990: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
69a0: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
69b0: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
69c0: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
69d0: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
69e0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
69f0: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
6a00: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
6a10: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
6a20: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
6a30: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
6a40: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
6a50: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
6a60: 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20 28  r) {.  assert( (
6a70: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
6a80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
6a90: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
6aa0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6ab0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
6ac0: 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  OCK) || .       
6ad0: 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20     (sqliteIOErr 
6ae0: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
6af0: 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20  RDLOCK) ||.     
6b00: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6b10: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6b20: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
6b30: 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74 63 68  OCK) );.  switch
6b40: 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a   (posixError) {.
6b50: 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a    case EACCES: .
6b60: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
6b70: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
6b80: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
6b90: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
6ba0: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
6bb0: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
6bc0: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
6bd0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
6be0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
6bf0: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
6c00: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
6c10: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
6c20: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
6c30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6c40: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
6c50: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
6c60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
6c70: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65 66 61  ERM;.    .  defa
6c80: 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ult: .    return
6c90: 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20   sqliteIOErr;.  
6ca0: 7d 0a 7d 0a 0a 0a 2f 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 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
6d00: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
6d10: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
6d20: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
6d30: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
6d40: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
6d50: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
6d60: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
6d70: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
6d80: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
6d90: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
6da0: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
6db0: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
6dc0: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
6dd0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
6de0: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
6df0: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
6e00: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
6e10: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
6e20: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
6e30: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
6e40: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
6e50: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
6e60: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
6e70: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
6e80: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
6e90: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
6ea0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
6eb0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
6ec0: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
6ed0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
6ee0: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
6ef0: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
6f00: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
6f10: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
6f20: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
6f30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
6f40: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
6f50: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
6f60: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
6f70: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
6f80: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
6f90: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
6fa0: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
6fb0: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
6fc0: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
6fd0: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
6fe0: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
6ff0: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
7000: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
7010: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7020: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
7030: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
7040: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
7050: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
7060: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
7070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7080: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7090: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
70a0: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
70b0: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
70d0: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
70e0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
70f0: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
7100: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
7110: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
7120: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
7130: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
7140: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
7150: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
7160: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
7170: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
7180: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
7190: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
71a0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
71b0: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
71c0: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
71d0: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
71e0: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
71f0: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
7200: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
7210: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
7220: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
7230: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
7240: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
7250: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
7260: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
7270: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
7280: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
7290: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
72a0: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
72b0: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
72c0: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
72d0: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
72e0: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
72f0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
7300: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
7310: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
7320: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
7330: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
7340: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
7350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7360: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
7370: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
7380: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
7390: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
73a0: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
73b0: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
73c0: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
73d0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
73e0: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
73f0: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
7400: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
7410: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
7420: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
7430: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
7440: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
7450: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7460: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
7470: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
7480: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
7490: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
74a0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
74b0: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
74c0: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
74d0: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
74e0: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
74f0: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
7500: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7510: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
7520: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
7530: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
7540: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
7550: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
7560: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
7570: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
7580: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
7590: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
75a0: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
75b0: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
75c0: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
75d0: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
75e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
75f0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
7600: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
7610: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
7620: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
7630: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
7640: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
7650: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
7660: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
7670: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
7680: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
7690: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
76a0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
76b0: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
76c0: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
76d0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
76e0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
76f0: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
7700: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
7710: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
7720: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7730: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
7740: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
7750: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
7760: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
7770: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
7780: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
7790: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
77a0: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
77b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 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 20 20 2f 2a 20 4c 65 6e            /* Len
77e0: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
77f0: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
7800: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
7810: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
7820: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
7830: 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61  rlen(zAbsoluteNa
7840: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
7850: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
7860: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
7870: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
7880: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
7890: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
78a0: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
78b0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
78c0: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
78d0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
78e0: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
78f0: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
7900: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
7910: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7920: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
7930: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
7940: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
7950: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
7960: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
7970: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
7980: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
7990: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
79a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
79b0: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
79c0: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
79d0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
79e0: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
79f0: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
7a00: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
7a10: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
7a20: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
7a30: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
7a40: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
7a50: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
7a60: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
7a70: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
7a80: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
7a90: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
7aa0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7ab0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
7ac0: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
7ad0: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
7ae0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
7af0: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
7b00: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
7b10: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
7b20: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
7b30: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
7b40: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
7b50: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
7b60: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
7b70: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
7b80: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
7b90: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
7ba0: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
7bb0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
7bc0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7bd0: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
7be0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
7bf0: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
7c00: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
7c10: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
7c20: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
7c30: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
7c40: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
7c50: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
7c60: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
7c70: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7c80: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
7c90: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
7ca0: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
7cb0: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
7cc0: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
7cd0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
7ce0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7cf0: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
7d00: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
7d10: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
7d20: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
7d30: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
7d40: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
7d50: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
7d60: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
7d70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
7d80: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
7d90: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
7da0: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
7db0: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
7dc0: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
7dd0: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
7de0: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
7df0: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
7e00: 2a 2a 2a 2a 2a 0a 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 2a 2a 2f 0a 0a 0a 2f 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 2a 2a 0a 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 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
7ed0: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
7ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ef0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
7f00: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
7f10: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
7f20: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
7f30: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
7f40: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
7f50: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
7f60: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
7f70: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
7f80: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
7f90: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
7fa0: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
7fb0: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
7fc0: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
7fd0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
7fe0: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
7ff0: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
8000: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
8010: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
8020: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
8030: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
8040: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
8050: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
8060: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
8070: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
8080: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
8090: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
80a0: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
80b0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
80c0: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
80d0: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
80e0: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
80f0: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
8100: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
8110: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
8120: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
8130: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
8140: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
8150: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
8160: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
8170: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
8180: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
8190: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
81a0: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
81b0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
81c0: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
81d0: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
81e0: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
81f0: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
8200: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
8210: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
8220: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
8230: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
8240: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
8250: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
8260: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
8270: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
8280: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
8290: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
82a0: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
82b0: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
82c0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
82d0: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
82e0: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
82f0: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
8300: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
8310: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
8320: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
8330: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
8340: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
8350: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
8360: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
8370: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
8380: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
8390: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
83a0: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
83b0: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
83c0: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
83d0: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
83e0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
83f0: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
8400: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
8410: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
8420: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
8430: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
8440: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
8450: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
8460: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
8470: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
8480: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
8490: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
84a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
84b0: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
84c0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
84d0: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
84e0: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
84f0: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
8500: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
8510: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
8520: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
8530: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
8540: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
8550: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
8560: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
8570: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
8580: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
8590: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
85a0: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
85b0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
85c0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
85d0: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
85e0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
85f0: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
8600: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
8610: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
8620: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
8630: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
8640: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
8650: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
8660: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
8670: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
8680: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
8690: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
86a0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
86b0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
86c0: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
86d0: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
86e0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
86f0: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
8700: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
8710: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
8720: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
8730: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
8740: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
8750: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
8760: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
8770: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
8780: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
8790: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
87a0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
87b0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
87c0: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
87d0: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
87e0: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
87f0: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
8800: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
8810: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
8820: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
8830: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
8840: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
8850: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
8860: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
8870: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
8880: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
8890: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
88a0: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
88b0: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
88c0: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
88d0: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
88e0: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
88f0: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
8900: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
8910: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
8920: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
8930: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
8940: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
8950: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
8960: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
8970: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
8980: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
8990: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
89a0: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
89b0: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
89c0: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
89d0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
89e0: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
89f0: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
8a00: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
8a10: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
8a20: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
8a30: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
8a40: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
8a50: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
8a60: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
8a70: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
8a80: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
8a90: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
8aa0: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
8ab0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
8ac0: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
8ad0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
8ae0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
8af0: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
8b00: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
8b10: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
8b20: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
8b30: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
8b40: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
8b50: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
8b60: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
8b70: 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65  , each unixInode
8b80: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d  Info object.** m
8b90: 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74  aintains a count
8ba0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
8bb0: 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  f pending locks 
8bc0: 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a  on tha inode..**
8bd0: 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   When an attempt
8be0: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73   is made to clos
8bf0: 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69  e an unixFile, i
8c00: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  f there are.** o
8c10: 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70  ther unixFile op
8c20: 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69  en on the same i
8c30: 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f  node that are ho
8c40: 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65  lding locks, the
8c50: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73   call.** to clos
8c60: 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73  e() the file des
8c70: 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72  criptor is defer
8c80: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66  red until all of
8c90: 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72   the locks clear
8ca0: 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f  ..** The unixIno
8cb0: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
8cc0: 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66   keeps a list of
8cd0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8ce0: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a  s that need to.*
8cf0: 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  * be closed and 
8d00: 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c  that list is wal
8d10: 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64  ked (and cleared
8d20: 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  ) when the last 
8d30: 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a  lock.** clears..
8d40: 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65  **.** Yet anothe
8d50: 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75  r problem:  Linu
8d60: 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20  xThreads do not 
8d70: 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70  play well with p
8d80: 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  osix locks..**.*
8d90: 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72  * Many older ver
8da0: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75  sions of linux u
8db0: 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65  se the LinuxThre
8dc0: 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63  ads library whic
8dd0: 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69  h is.** not posi
8de0: 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e  x compliant.  Un
8df0: 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  der LinuxThreads
8e00: 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  , a lock created
8e10: 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20   by thread.** A 
8e20: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  cannot be modifi
8e30: 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  ed or overridden
8e40: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
8e50: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c  thread B..** Onl
8e60: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d  y thread A can m
8e70: 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20  odify the lock. 
8e80: 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   Locking behavio
8e90: 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20  r is correct.** 
8ea0: 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f  if the appliatio
8eb0: 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72  n uses the newer
8ec0: 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68   Native Posix Th
8ed0: 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50  read Library (NP
8ee0: 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20  TL).** on linux 
8ef0: 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f  - with NPTL a lo
8f00: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
8f10: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
8f20: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20  ide locks.** in 
8f30: 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74  thread B.  But t
8f40: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
8f50: 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  o know at compil
8f60: 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20  e-time which.** 
8f70: 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72  threading librar
8f80: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  y is being used.
8f90: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f    So there is no
8fa0: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a   way to know at.
8fb0: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
8fc0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
8fd0: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
8fe0: 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ride locks on th
8ff0: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68  read B..** One h
9000: 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74  as to do a run-t
9010: 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73  ime check to dis
9020: 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69  cover the behavi
9030: 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  or of the.** cur
9040: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  rent process..**
9050: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20  .** SQLite used 
9060: 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78  to support Linux
9070: 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75  Threads.  But su
9080: 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54  pport for LinuxT
9090: 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72  hreads.** was dr
90a0: 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20  opped beginning 
90b0: 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37  with version 3.7
90c0: 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c  .0.  SQLite will
90d0: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68   still work with
90e0: 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73  .** LinuxThreads
90f0: 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28   provided that (
9100: 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  1) there is no m
9110: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e  ore than one con
9120: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20  nection .** per 
9130: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
9140: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
9150: 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61  s and (2) databa
9160: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
9170: 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63  * do not move ac
9180: 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f  ross threads..*/
9190: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
91a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
91b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
91c0: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
91d0: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
91e0: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
91f0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
9200: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ject..*/.struct 
9210: 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64  unixFileId {.  d
9220: 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20  ev_t dev;       
9230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
9240: 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  vice number */.#
9250: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
9260: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
9270: 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55  leId *pId;  /* U
9280: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
9290: 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65  r vxworks. */.#e
92a0: 6c 73 65 0a 20 20 2f 2a 20 57 65 20 61 72 65 20  lse.  /* We are 
92b0: 74 6f 6c 64 20 74 68 61 74 20 73 6f 6d 65 20 76  told that some v
92c0: 65 72 73 69 6f 6e 73 20 6f 66 20 41 6e 64 72 6f  ersions of Andro
92d0: 69 64 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67  id contain a bug
92e0: 20 74 68 61 74 0a 20 20 2a 2a 20 73 69 7a 65 73   that.  ** sizes
92f0: 20 69 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79 20 33   ino_t at only 3
9300: 32 2d 62 69 74 73 20 69 6e 73 74 65 61 64 20 6f  2-bits instead o
9310: 66 20 36 34 2d 62 69 74 73 2e 20 28 53 65 65 0a  f 64-bits. (See.
9320: 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 61 6e 64    ** https://and
9330: 72 6f 69 64 2d 72 65 76 69 65 77 2e 67 6f 6f 67  roid-review.goog
9340: 6c 65 73 6f 75 72 63 65 2e 63 6f 6d 2f 23 2f 63  lesource.com/#/c
9350: 2f 31 31 35 33 35 31 2f 33 2f 64 69 73 74 2f 73  /115351/3/dist/s
9360: 71 6c 69 74 65 33 2e 63 29 0a 20 20 2a 2a 20 54  qlite3.c).  ** T
9370: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
9380: 69 73 2c 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  is, always alloc
9390: 61 74 65 20 36 34 2d 62 69 74 73 20 66 6f 72 20  ate 64-bits for 
93a0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
93b0: 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d 61 6c  .  .  ** On smal
93c0: 6c 20 6d 61 63 68 69 6e 65 73 20 74 68 61 74 20  l machines that 
93d0: 6f 6e 6c 79 20 68 61 76 65 20 33 32 2d 62 69 74  only have 32-bit
93e0: 20 69 6e 6f 64 65 73 2c 20 74 68 69 73 20 77 61   inodes, this wa
93f0: 73 74 65 73 20 34 20 62 79 74 65 73 2c 0a 20 20  stes 4 bytes,.  
9400: 2a 2a 20 62 75 74 20 74 68 61 74 20 73 68 6f 75  ** but that shou
9410: 6c 64 20 6e 6f 74 20 62 65 20 61 20 62 69 67 20  ld not be a big 
9420: 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20 57 41  deal. */.  /* WA
9430: 53 3a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  S:  ino_t ino;  
9440: 20 2a 2f 0a 20 20 75 36 34 20 69 6e 6f 3b 20 20   */.  u64 ino;  
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
9470: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
9480: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
9490: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
94a0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
94b0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
94c0: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
94d0: 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68    Or, on LinuxTh
94e0: 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20  reads, there is 
94f0: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72  one of these str
9500: 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65  uctures for.** e
9510: 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64  ach inode opened
9520: 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e   by each thread.
9530: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
9540: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
9550: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
9560: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
9570: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
9580: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
9590: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
95a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
95b0: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
95c0: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
95d0: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
95e0: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
95f0: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
9600: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  it..*/.struct un
9610: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
9620: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
9630: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
9640: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
9650: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72  y */.  int nShar
9660: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
9670: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9680: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
9690: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
96a0: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
96b0: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ck;        /* On
96c0: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
96d0: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
96e0: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
96f0: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
9700: 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20  Lock;     /* An 
9710: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
9720: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
9730: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 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 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9760: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
9770: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
9780: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
9790: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
97a0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
97b0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
97c0: 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  h this inode */.
97d0: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
9800: 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20  utstanding file 
9810: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55  locks */.  UnixU
9820: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
9830: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
9840: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
9850: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
9860: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
9870: 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  o *pNext;       
9880: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
9890: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
98a0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e   objects */.  un
98b0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72  ixInodeInfo *pPr
98c0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ev;           /*
98d0: 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20      .... doubly 
98e0: 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51  linked */.#if SQ
98f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
9900: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69  ING_STYLE.  unsi
9910: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
9920: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
9930: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
9940: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
9950: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
9960: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
9970: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
9980: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
9990: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
99a0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
99b0: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
99c0: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
99d0: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
99e0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
99f0: 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61  .** A lists of a
9a00: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
9a10: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
9a20: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
9a30: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
9a40: 3b 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 49 6e  ;  /* All unixIn
9a50: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
9a60: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
9a70: 65 64 20 69 6e 74 20 6e 55 6e 75 73 65 64 46 64  ed int nUnusedFd
9a80: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 6f 74 61   = 0;    /* Tota
9a90: 6c 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  l unused file de
9aa0: 73 63 72 69 70 74 6f 72 73 20 2a 2f 0a 0a 2f 2a  scriptors */../*
9ab0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9ac0: 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72  tion - unixLogEr
9ad0: 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69 73 20  rorAtLine(), is 
9ae0: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
9af0: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
9b00: 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29  * unixLogError()
9b10: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e  ..**.** It is in
9b20: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65  voked after an e
9b30: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61  rror occurs in a
9b40: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e  n OS function an
9b50: 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e  d errno has been
9b60: 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73  .** set. It logs
9b70: 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67   a message using
9b80: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63   sqlite3_log() c
9b90: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
9ba0: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a  rrent value of.*
9bb0: 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20  * errno and, if 
9bc0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
9bd0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
9be0: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72  ivalent from str
9bf0: 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74  error() or.** st
9c00: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a  rerror_r()..**.*
9c10: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
9c20: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
9c30: 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  he macro should 
9c40: 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  be the error cod
9c50: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
9c60: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  e returned to SQ
9c70: 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54  Lite (e.g. SQLIT
9c80: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
9c90: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
9ca0: 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  . .** The two su
9cb0: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
9cc0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
9cd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
9ce0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
9cf0: 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75   failed (e.g. "u
9d00: 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20  nlink", "open") 
9d10: 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74  and the associat
9d20: 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  ed file-system p
9d30: 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a  ath,.** if any..
9d40: 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c  */.#define unixL
9d50: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20  ogError(a,b,c)  
9d60: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
9d70: 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49  tLine(a,b,c,__LI
9d80: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
9d90: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9da0: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
9db0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
9dc0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
9dd0: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
9de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
9df0: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
9e00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66   /* Name of OS f
9e10: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69  unction that fai
9e20: 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  led */.  const c
9e30: 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
9e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
9e50: 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64   path associated
9e60: 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20   with error */. 
9e70: 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20   int iLine      
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20   /* Source line 
9ea0: 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72  number where err
9eb0: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29  or occurred */.)
9ec0: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20  {.  char *zErr; 
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66      /* Message f
9ef0: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
9f00: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a  r equivalent */.
9f10: 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65    int iErrno = e
9f20: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
9f30: 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61    /* Saved sysca
9f40: 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20  ll error number 
9f50: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
9f60: 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64   is not a thread
9f70: 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49  safe build (SQLI
9f80: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30  TE_THREADSAFE==0
9f90: 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a  ), then use.  **
9fa0: 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20   the strerror() 
9fb0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  function to obta
9fc0: 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  in the human-rea
9fd0: 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  dable error mess
9fe0: 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c  age.  ** equival
9ff0: 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74  ent to errno. Ot
a000: 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72  herwise, use str
a010: 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20  error_r()..  */ 
a020: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
a030: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
a040: 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f  d(HAVE_STRERROR_
a050: 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38  R).  char aErr[8
a060: 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72  0];.  memset(aEr
a070: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72  r, 0, sizeof(aEr
a080: 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45  r));.  zErr = aE
a090: 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52  rr;..  /* If STR
a0a0: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28  ERROR_R_CHAR_P (
a0b0: 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20  set by autoconf 
a0c0: 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53  scripts) or __US
a0d0: 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64  E_GNU is defined
a0e0: 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68  ,.  ** assume th
a0f0: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72  at the system pr
a100: 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20 76  ovides the GNU v
a110: 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72  ersion of strerr
a120: 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a 2a  or_r() that.  **
a130: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
a140: 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
a150: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72  ontaining the er
a160: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61  ror message. Tha
a170: 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20  t pointer .  ** 
a180: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72  may point to aEr
a190: 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70  r[], or it may p
a1a0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61  oint to some sta
a1b0: 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65  tic storage some
a1c0: 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68  where. .  ** Oth
a1d0: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74  erwise, assume t
a1e0: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
a1f0: 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49  rovides the POSI
a200: 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  X version of .  
a210: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c  ** strerror_r(),
a220: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72   which always wr
a230: 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ites an error me
a240: 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b  ssage into aErr[
a250: 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  ]..  **.  ** If 
a260: 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65  the code incorre
a270: 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61  ctly assumes tha
a280: 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49  t it is the POSI
a290: 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69  X version that i
a2a0: 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
a2b0: 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  , the error mess
a2c0: 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62  age will often b
a2d0: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
a2e0: 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75  g. Not a.  ** hu
a2f0: 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f  ge problem. Inco
a300: 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69  rrectly concludi
a310: 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20  ng that the GNU 
a320: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
a330: 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64  able .  ** could
a340: 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61   lead to a segfa
a350: 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f  ult though..  */
a360: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52  .#if defined(STR
a370: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20  ERROR_R_CHAR_P) 
a380: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45  || defined(__USE
a390: 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a  _GNU).  zErr = .
a3a0: 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72  # endif.  strerr
a3b0: 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72  or_r(iErrno, aEr
a3c0: 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d  r, sizeof(aErr)-
a3d0: 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54  1);..#elif SQLIT
a3e0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f  E_THREADSAFE.  /
a3f0: 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65  * This is a thre
a400: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75  adsafe build, bu
a410: 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69  t strerror_r() i
a420: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
a430: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b   */.  zErr = "";
a440: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d  .#else.  /* Non-
a450: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
a460: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29  , use strerror()
a470: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74  . */.  zErr = st
a480: 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a  rerror(iErrno);.
a490: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a 50  #endif..  if( zP
a4a0: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
a4b0: 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c   "";.  sqlite3_l
a4c0: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
a4d0: 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a    "os_unix.c:%d:
a4e0: 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25   (%d) %s(%s) - %
a4f0: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
a500: 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20   iErrno, zFunc, 
a510: 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b  zPath, zErr.  );
a520: 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f  ..  return errco
a530: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  de;.}../*.** Clo
a540: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
a550: 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ptor..**.** We a
a560: 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65  ssume that close
a570: 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  () almost always
a580: 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74   works, since it
a590: 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a   is only in a.**
a5a0: 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69   very sick appli
a5b0: 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76  cation or on a v
a5c0: 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72  ery sick platfor
a5d0: 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  m that it might 
a5e0: 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64  fail..** If it d
a5f0: 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79  oes fail, simply
a600: 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64   leak the file d
a610: 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64  escriptor, but d
a620: 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72  o log the.** err
a630: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  or..**.** Note t
a640: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
a650: 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73  fe to retry clos
a660: 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20  e() after EINTR 
a670: 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c  since the.** fil
a680: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67  e descriptor mig
a690: 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ht have already 
a6a0: 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61  been reused by a
a6b0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a  nother thread..*
a6c0: 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76  * So we don't ev
a6d0: 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65  en try to recove
a6e0: 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e  r from an EINTR.
a6f0: 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65    Just log the e
a700: 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65  rror.** and move
a710: 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   on..*/.static v
a720: 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  oid robust_close
a730: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
a740: 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e  , int h, int lin
a750: 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c  eno){.  if( osCl
a760: 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e  ose(h) ){.    un
a770: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
a780: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
a790: 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20  OSE, "close",.  
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69       pFile ? pFi
a7c0: 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c  le->zPath : 0, l
a7d0: 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ineno);.  }.}../
a7e0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46 69  *.** Set the pFi
a7f0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20  le->lastErrno.  
a800: 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62  Do this in a sub
a810: 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74 20  routine as that 
a820: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f  provides.** a co
a830: 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74  nvenient place t
a840: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
a850: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
a860: 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e  id storeLastErrn
a870: 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  o(unixFile *pFil
a880: 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20  e, int error){. 
a890: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a8a0: 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  o = error;.}../*
a8b0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69  .** Close all fi
a8c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61  le descriptors a
a8d0: 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65  ccumuated in the
a8e0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e   unixInodeInfo->
a8f0: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
a900: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c   .static void cl
a910: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e  osePendingFds(un
a920: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
a930: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
a940: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
a950: 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
a960: 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e  nusedFd *p;.  Un
a970: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
a980: 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64  t;.  for(p=pInod
a990: 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70  e->pUnused; p; p
a9a0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
a9b0: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
a9c0: 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
a9d0: 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f  pFile, p->fd, __
a9e0: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c  LINE__);.    sql
a9f0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
aa00: 20 20 6e 55 6e 75 73 65 64 46 64 2d 2d 3b 0a 20    nUnusedFd--;. 
aa10: 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e   }.  pInode->pUn
aa20: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
aa30: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69  ** Release a uni
aa40: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
aa50: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
aa60: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
aa70: 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a  dInodeInfo()..**
aa80: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
aa90: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
aaa0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
aab0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
aac0: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
aad0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
aae0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
aaf0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e  c void releaseIn
ab00: 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65  odeInfo(unixFile
ab10: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
ab20: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
ab30: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
ab40: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
ab50: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
ab60: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
ab70: 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  ode) ){.    pIno
ab80: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
ab90: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
aba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
abb0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68  ert( pInode->pSh
abc0: 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20  mNode==0 );.    
abd0: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
abe0: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
abf0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
ac00: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
ac10: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
ac20: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
ac30: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
ac40: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
ac50: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
ac60: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
ac70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ac80: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
ac90: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
aca0: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
acb0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
acc0: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
acd0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
ace0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
acf0: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
ad00: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
ad10: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
ad20: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
ad30: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
ad40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
ad50: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
ad60: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
ad70: 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c 7c   inodeList!=0 ||
ad80: 20 6e 55 6e 75 73 65 64 46 64 3d 3d 30 20 29 3b   nUnusedFd==0 );
ad90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
ada0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
adb0: 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e  r, locate the un
adc0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
add0: 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  ct that.** descr
ade0: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
adf0: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
ae00: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
ae10: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
ae20: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
ae30: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
ae40: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
ae50: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
ae60: 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72   The mutex enter
ae70: 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69  ed using the uni
ae80: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75  xEnterMutex() fu
ae90: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68  nction must be h
aea0: 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  eld.** when this
aeb0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
aec0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
aed0: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
aee0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
aef0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49  static int findI
af00: 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78  nodeInfo(.  unix
af10: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
af20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
af30: 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c  ix file with fil
af40: 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74  e desc used in t
af50: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78  he key */.  unix
af60: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e  InodeInfo **ppIn
af70: 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ode        /* Re
af80: 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  turn the unixIno
af90: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65  deInfo object he
afa0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
afb0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
afc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73            /* Sys
afd0: 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20  tem call return 
afe0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64  code */.  int fd
aff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b000: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b010: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
b020: 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73  for pFile */.  s
b030: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
b040: 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a   fileId;      /*
b050: 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20   Lookup key for 
b060: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
b070: 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  o */.  struct st
b080: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
b090: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76        /* Low-lev
b0a0: 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  el file informat
b0b0: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ion */.  unixIno
b0c0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
b0d0: 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69   0;     /* Candi
b0e0: 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  date unixInodeIn
b0f0: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  fo object */..  
b100: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
b110: 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a  xHeld() );..  /*
b120: 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69   Get low-level i
b130: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
b140: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
b150: 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20  e can used to.  
b160: 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  ** create a uniq
b170: 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ue name for the 
b180: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20  file..  */.  fd 
b190: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63  = pFile->h;.  rc
b1a0: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
b1b0: 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20  statbuf);.  if( 
b1c0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f  rc!=0 ){.    sto
b1d0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
b1e0: 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64  e, errno);.#if d
b1f0: 65 66 69 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57  efined(EOVERFLOW
b200: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
b210: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29  ITE_DISABLE_LFS)
b220: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
b230: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52  lastErrno==EOVER
b240: 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51  FLOW ) return SQ
b250: 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64  LITE_NOLFS;.#end
b260: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
b270: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
b280: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
b290: 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f  _.  /* On OS X o
b2a0: 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73  n an msdos files
b2b0: 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65  ystem, the inode
b2c0: 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72   number is repor
b2d0: 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65  ted.  ** incorre
b2e0: 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69  ctly for zero-si
b2f0: 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74  ze files.  See t
b300: 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f  icket #3260.  To
b310: 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e   work.  ** aroun
b320: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  d this problem (
b330: 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61  we consider it a
b340: 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f   bug in OS X, no
b350: 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77  t SQLite).  ** w
b360: 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73  e always increas
b370: 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
b380: 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20  to 1 by writing 
b390: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
b3a0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65  ** prior to acce
b3b0: 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20  ssing the inode 
b3c0: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65  number.  The one
b3d0: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73   byte written is
b3e0: 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27  .  ** an ASCII '
b3f0: 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69  S' character whi
b400: 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20  ch also happens 
b410: 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
b420: 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  byte.  ** in the
b430: 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79   header of every
b440: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
b450: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
b460: 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  if there.  ** is
b470: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
b480: 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74  n such that anot
b490: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61  her thread has a
b4a0: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
b4b0: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
b4c0: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
b4d0: 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20  base, no damage 
b4e0: 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  is done..  */.  
b4f0: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73  if( statbuf.st_s
b500: 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65  ize==0 && (pFile
b510: 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  ->fsFlags & SQLI
b520: 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
b530: 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64  DOS)!=0 ){.    d
b540: 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28  o{ rc = osWrite(
b550: 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68  fd, "S", 1); }wh
b560: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
b570: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
b580: 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20   if( rc!=1 ){.  
b590: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
b5a0: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
b5b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
b5c0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
b5d0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73   }.    rc = osFs
b5e0: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
b5f0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
b600: 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
b610: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
b620: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65  errno);.      re
b630: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
b640: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
b650: 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66  dif..  memset(&f
b660: 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66  ileId, 0, sizeof
b670: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c  (fileId));.  fil
b680: 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75  eId.dev = statbu
b690: 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53  f.st_dev;.#if OS
b6a0: 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49  _VXWORKS.  fileI
b6b0: 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70  d.pId = pFile->p
b6c0: 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65  Id;.#else.  file
b6d0: 49 64 2e 69 6e 6f 20 3d 20 28 75 36 34 29 73 74  Id.ino = (u64)st
b6e0: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
b6f0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 69  ndif.  assert( i
b700: 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c 7c 20 6e  nodeList!=0 || n
b710: 55 6e 75 73 65 64 46 64 3d 3d 30 20 29 3b 0a 20  UnusedFd==0 );. 
b720: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
b730: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
b740: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
b750: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
b760: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
b770: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
b780: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
b790: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
b7a0: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
b7b0: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
b7c0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
b7d0: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b  zeof(*pInode) );
b7e0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d  .    if( pInode=
b7f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
b800: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
b810: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
b820: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
b830: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
b840: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
b850: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
b860: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
b870: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49  fileId));.    pI
b880: 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  node->nRef = 1;.
b890: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
b8a0: 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  t = inodeList;. 
b8b0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
b8c0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e   = 0;.    if( in
b8d0: 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c  odeList ) inodeL
b8e0: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ist->pPrev = pIn
b8f0: 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69  ode;.    inodeLi
b900: 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d  st = pInode;.  }
b910: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65  else{.    pInode
b920: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
b930: 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64  *ppInode = pInod
b940: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
b950: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b960: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70  Return TRUE if p
b970: 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  File has been re
b980: 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65  named or unlinke
b990: 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 66  d since it was f
b9a0: 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  irst opened..*/.
b9b0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48  static int fileH
b9c0: 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65  asMoved(unixFile
b9d0: 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53   *pFile){.#if OS
b9e0: 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72  _VXWORKS.  retur
b9f0: 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21  n pFile->pInode!
ba00: 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64  =0 && pFile->pId
ba10: 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  !=pFile->pInode-
ba20: 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c  >fileId.pId;.#el
ba30: 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  se.  struct stat
ba40: 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70   buf;.  return p
ba50: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
ba60: 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74  &&.      (osStat
ba70: 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
ba80: 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20 20 20  buf)!=0 .       
ba90: 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e 73 74    || (u64)buf.st
baa0: 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  _ino!=pFile->pIn
bab0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29  ode->fileId.ino)
bac0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
bad0: 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46  ** Check a unixF
bae0: 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61  ile that is a da
baf0: 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20  tabase.  Verify 
bb00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
bb10: 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69  *.** (1) There i
bb20: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61  s exactly one ha
bb30: 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66  rd link on the f
bb40: 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66  ile.** (2) The f
bb50: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d  ile is not a sym
bb60: 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33  bolic link.** (3
bb70: 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e  ) The file has n
bb80: 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20  ot been renamed 
bb90: 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a  or unlinked.**.*
bba0: 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f  * Issue sqlite3_
bbb0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
bbc0: 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73  NG,...) messages
bbd0: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20   if anything is 
bbe0: 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74  not right..*/.st
bbf0: 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79  atic void verify
bc00: 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  DbFile(unixFile 
bc10: 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63  *pFile){.  struc
bc20: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e  t stat buf;.  in
bc30: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 73  t rc;..  /* Thes
bc40: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
bc50: 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65 20 6d  occurs for the m
bc60: 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 6c  ain database onl
bc70: 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  y */.  if( pFile
bc80: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
bc90: 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 20  IXFILE_NOLOCK ) 
bca0: 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20 3d 20  return;..  rc = 
bcb0: 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
bcc0: 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72  , &buf);.  if( r
bcd0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c!=0 ){.    sqli
bce0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
bcf0: 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20  ARNING, "cannot 
bd00: 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25 73  fstat db file %s
bd10: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
bd20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
bd30: 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e  }.  if( buf.st_n
bd40: 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73  link==0 ){.    s
bd50: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
bd60: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65  E_WARNING, "file
bd70: 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20   unlinked while 
bd80: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
bd90: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
bda0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
bdb0: 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29  buf.st_nlink>1 )
bdc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
bdd0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
bde0: 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b  , "multiple link
bdf0: 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20  s to file: %s", 
be00: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
be10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
be20: 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76 65   if( fileHasMove
be30: 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  d(pFile) ){.    
be40: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
be50: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
be60: 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65 20  e renamed while 
be70: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
be80: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
be90: 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  turn;.  }.}.../*
bea0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
beb0: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
bec0: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
bed0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
bee0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
bef0: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
bf00: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
bf10: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
bf20: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
bf30: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
bf40: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
bf50: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
bf60: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
bf70: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
bf80: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
bf90: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
bfa0: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
bfb0: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
bfc0: 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
bfd0: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
bfe0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
bff0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
c000: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
c010: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c020: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
c030: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
c040: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
c050: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
c060: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
c070: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
c080: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
c090: 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
c0a0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
c0b0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
c0c0: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
c0d0: 4c 4f 43 4b 20 29 3b 0a 20 20 75 6e 69 78 45 6e  LOCK );.  unixEn
c0e0: 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
c0f0: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
c100: 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
c110: 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
c120: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
c130: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
c140: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
c150: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
c160: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
c170: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
c180: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
c190: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
c1a0: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
c1b0: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
c1c0: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
c1d0: 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  s it..  */.#ifnd
c1e0: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69  ef __DJGPP__.  i
c1f0: 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20  f( !reserved && 
c200: 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  !pFile->pInode->
c210: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a  bProcessLock ){.
c220: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
c230: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
c240: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
c250: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
c260: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
c270: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
c280: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
c290: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
c2a0: 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73  RLCK;.    if( os
c2b0: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
c2c0: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20  F_GETLK, &lock) 
c2d0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
c2e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
c2f0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20  RESERVEDLOCK;.  
c300: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
c310: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
c320: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
c330: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
c340: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
c350: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
c360: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
c370: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
c380: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
c390: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
c3a0: 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22   %d %d (unix)\n"
c3b0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
c3c0: 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
c3d0: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
c3e0: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
c3f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
c400: 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65  t to set a syste
c410: 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  m-lock on the fi
c420: 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c  le pFile.  The l
c430: 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72  ock is .** descr
c440: 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a  ibed by pLock..*
c450: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c  *.** If the pFil
c460: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61  e was opened rea
c470: 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69  d/write from uni
c480: 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65  x-excl, then the
c490: 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76   only lock.** ev
c4a0: 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61  er obtained is a
c4b0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
c4c0: 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61  , and it is obta
c4d0: 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  ined exactly onc
c4e0: 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  e.** the first t
c4f0: 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20  ime any lock is 
c500: 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20  attempted.  All 
c510: 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65  subsequent syste
c520: 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65  m locking.** ope
c530: 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e  rations become n
c540: 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20  o-ops.  Locking 
c550: 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c  operations still
c560: 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c   happen internal
c570: 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ly,.** in order 
c580: 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63  to coordinate ac
c590: 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70  cess between sep
c5a0: 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63  arate database c
c5b0: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69  onnections.** wi
c5c0: 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  thin this proces
c5d0: 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68  s, but all of th
c5e0: 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  at is handled in
c5f0: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a   memory and the.
c600: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
c610: 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72  tem does not par
c620: 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ticipate..**.** 
c630: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
c640: 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20   a pass-through 
c650: 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b  to fcntl(F_SETLK
c660: 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73  ) if pFile is us
c670: 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f  ing.** any VFS o
c680: 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d  ther than "unix-
c690: 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c  excl" or if pFil
c6a0: 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22  e is opened on "
c6b0: 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e  unix-excl".** an
c6c0: 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  d is read-only..
c6d0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
c6e0: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61  turned if the ca
c6f0: 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63  ll completes suc
c700: 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31  cessfully, or -1
c710: 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f   if a call.** to
c720: 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20   fcntl() fails. 
c730: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72  In this case, er
c740: 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f  rno is set appro
c750: 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e  priately (by fcn
c760: 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tl())..*/.static
c770: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63   int unixFileLoc
c780: 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
c790: 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  e, struct flock 
c7a0: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  *pLock){.  int r
c7b0: 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  c;.  unixInodeIn
c7c0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
c7d0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
c7e0: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
c7f0: 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72  eld() );.  asser
c800: 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
c810: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74    if( (pFile->ct
c820: 72 6c 46 6c 61 67 73 20 26 20 28 55 4e 49 58 46  rlFlags & (UNIXF
c830: 49 4c 45 5f 45 58 43 4c 7c 55 4e 49 58 46 49 4c  ILE_EXCL|UNIXFIL
c840: 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e 49 58  E_RDONLY))==UNIX
c850: 46 49 4c 45 5f 45 58 43 4c 20 29 7b 0a 20 20 20  FILE_EXCL ){.   
c860: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
c870: 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
c880: 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f        struct flo
c890: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  ck lock;.      a
c8a0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
c8b0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
c8c0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
c8d0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
c8e0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
c8f0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
c900: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
c910: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
c920: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
c930: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20  = F_WRLCK;.     
c940: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
c950: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
c960: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69   &lock);.      i
c970: 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  f( rc<0 ) return
c980: 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64   rc;.      pInod
c990: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
c9a0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  = 1;.      pInod
c9b0: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
c9c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
c9d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
c9e0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  se{.    rc = osF
c9f0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
ca00: 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a  _SETLK, pLock);.
ca10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ca20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
ca30: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
ca40: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
ca50: 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
ca60: 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
ca70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
ca80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
ca90: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
caa0: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
cab0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
cac0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
cad0: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
cae0: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
caf0: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
cb00: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
cb10: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
cb20: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
cb30: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
cb40: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
cb50: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
cb60: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
cb70: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
cb80: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
cb90: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
cba0: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
cbb0: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
cbc0: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
cbd0: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
cbe0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
cbf0: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
cc00: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
cc10: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
cc20: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
cc30: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
cc40: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
cc50: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
cc60: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
cc70: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
cc80: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
cc90: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
cca0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
ccb0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
ccc0: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
ccd0: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
cce0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
ccf0: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
cd00: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
cd10: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
cd20: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
cd30: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
cd40: 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
cd50: 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  nt unixLock(sqli
cd60: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
cd70: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
cd80: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
cd90: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
cda0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
cdb0: 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63   the various loc
cdc0: 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b  ks and.  ** lock
cdd0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20   transitions in 
cde0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53  terms of the POS
cdf0: 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72  IX advisory shar
ce00: 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  ed and exclusive
ce10: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69  .  ** lock primi
ce20: 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65  tives (called re
ce30: 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69  ad-locks and wri
ce40: 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20  te-locks below, 
ce50: 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f  to avoid.  ** co
ce60: 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c  nfusion with SQL
ce70: 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e  ite lock names).
ce80: 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20   The algorithms 
ce90: 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a  are complicated.
cea0: 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e    ** slightly in
ceb0: 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d   order to be com
cec0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 57 69 6e  patible with Win
ced0: 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73 20 73  dows95 systems s
cee0: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
cef0: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
cf00: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
cf10: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
cf20: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
cf30: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
cf40: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
cf50: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
cf60: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
cf70: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
cf80: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
cf90: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
cfa0: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
cfb0: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
cfc0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
cfd0: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
cfe0: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
cff0: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
d000: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
d010: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
d020: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
d030: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
d040: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
d050: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
d060: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
d070: 65 73 73 66 75 6c 2c 20 27 73 68 61 72 65 64 20  essful, 'shared 
d080: 62 79 74 65 20 72 61 6e 67 65 27 20 69 73 20 72  byte range' is r
d090: 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a 2a 20  ead-locked.  ** 
d0a0: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
d0b0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
d0c0: 65 27 20 72 65 6c 65 61 73 65 64 2e 20 20 28 4c  e' released.  (L
d0d0: 65 67 61 63 79 20 6e 6f 74 65 3a 20 20 57 68 65  egacy note:  Whe
d0e0: 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 77 61  n.  ** SQLite wa
d0f0: 73 20 66 69 72 73 74 20 64 65 76 65 6c 6f 70 65  s first develope
d100: 64 2c 20 57 69 6e 64 6f 77 73 39 35 20 73 79 73  d, Windows95 sys
d110: 74 65 6d 73 20 77 65 72 65 20 73 74 69 6c 6c 20  tems were still 
d120: 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20 20 2a  very common,.  *
d130: 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73 39 35 20  * and Widnows95 
d140: 6c 61 63 6b 73 20 61 20 73 68 61 72 65 64 2d 6c  lacks a shared-l
d150: 6f 63 6b 20 63 61 70 61 62 69 6c 69 74 79 2e 20  ock capability. 
d160: 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35   So on Windows95
d170: 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20  , a.  ** single 
d180: 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65  randomly selecte
d190: 64 20 62 79 20 66 72 6f 6d 20 74 68 65 20 27 73  d by from the 's
d1a0: 68 61 72 65 64 20 62 79 74 65 20 72 61 6e 67 65  hared byte range
d1b0: 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a  ' is locked..  *
d1c0: 2a 20 57 69 6e 64 6f 77 73 39 35 20 69 73 20 6e  * Windows95 is n
d1d0: 6f 77 20 70 72 65 74 74 79 20 6d 75 63 68 20 65  ow pretty much e
d1e0: 78 74 69 6e 63 74 2c 20 62 75 74 20 74 68 69 73  xtinct, but this
d1f0: 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 66 6f 72   work-around for
d200: 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63 6b 20 6f   the.  ** lack o
d210: 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b 73 20 6f  f shared-locks o
d220: 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c 69 76 65  n Windows95 live
d230: 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63 6b 77 61  s on, for backwa
d240: 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69  rds.  ** compati
d250: 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a 20 20  bility.).  **.  
d260: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
d270: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
d280: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
d290: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
d2a0: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
d2b0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
d2c0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
d2d0: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
d2e0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
d2f0: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
d300: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
d310: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
d320: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
d330: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
d340: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
d350: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
d360: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
d370: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
d380: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
d390: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
d3a0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
d3b0: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
d3c0: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
d3d0: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
d3e0: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
d3f0: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
d400: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
d410: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
d420: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
d430: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
d440: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
d450: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
d460: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
d470: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
d480: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
d490: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
d4a0: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
d4b0: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
d4c0: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
d4d0: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
d4e0: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
d4f0: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
d500: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
d510: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
d520: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
d530: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
d540: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
d550: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
d560: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
d570: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
d580: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
d590: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
d5a0: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
d5b0: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
d5c0: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
d5d0: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
d5e0: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
d5f0: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
d600: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f 0a 20 20  tabase. .  */.  
d610: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d620: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
d630: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
d640: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
d650: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
d660: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
d670: 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  ock;.  int tErrn
d680: 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  o = 0;..  assert
d690: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
d6a0: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
d6b0: 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
d6c0: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
d6d0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
d6e0: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
d6f0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
d700: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
d710: 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
d720: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
d730: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
d740: 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  ock), pFile->pIn
d750: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
d760: 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29      osGetpid(0))
d770: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
d780: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
d790: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
d7a0: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
d7b0: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
d7c0: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
d7d0: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
d7e0: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
d7f0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
d800: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
d810: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
d820: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
d830: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
d840: 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
d850: 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
d860: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
d870: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
d880: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
d890: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
d8a0: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
d8b0: 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
d8c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d8d0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
d8e0: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
d8f0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
d900: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
d910: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
d920: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
d930: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
d940: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
d950: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
d960: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
d970: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
d980: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
d990: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
d9a0: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
d9b0: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
d9c0: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
d9d0: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
d9e0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
d9f0: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
da00: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
da10: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
da20: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
da30: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
da40: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
da50: 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
da60: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
da70: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
da80: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
da90: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
daa0: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
dab0: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
dac0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
dad0: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
dae0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
daf0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
db00: 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
db10: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
db20: 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
db30: 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
db40: 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
db50: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
db60: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
db70: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
db80: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
db90: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
dba0: 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
dbb0: 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
dbc0: 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d          (pInode-
dbd0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
dbe0: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
dbf0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
dc00: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
dc10: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
dc20: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
dc30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
dc40: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
dc50: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
dc60: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
dc70: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
dc80: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
dc90: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
dca0: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
dcb0: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
dcc0: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
dcd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
dce0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
dcf0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
dd00: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49  CK && .      (pI
dd10: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
dd20: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
dd30: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
dd40: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
dd50: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
dd60: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
dd70: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
dd80: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
dd90: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
dda0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
ddb0: 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
ddc0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
ddd0: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
dde0: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
ddf0: 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
de00: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
de10: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
de20: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50  ;.  }...  /* A P
de30: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
de40: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
de50: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
de60: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
de70: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
de80: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
de90: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
dea0: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
deb0: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
dec0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
ded0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
dee0: 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  L;.  lock.l_when
def0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
df00: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
df10: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
df20: 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
df30: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
df40: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
df50: 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
df60: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
df70: 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65  .l_type = (eFile
df80: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
df90: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
dfa0: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
dfb0: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
dfc0: 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  YTE;.    if( uni
dfd0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
dfe0: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
dff0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
e000: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e010: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
e020: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
e030: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
e040: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
e050: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
e060: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
e070: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
e080: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
e090: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
e0a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  k;.    }.  }... 
e0b0: 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
e0c0: 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
e0d0: 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
e0e0: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
e0f0: 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
e100: 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
e110: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
e120: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
e130: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
e140: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
e150: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
e160: 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
e170: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
e180: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
e190: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
e1a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
e1b0: 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
e1c0: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  he read-lock */.
e1d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
e1e0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
e1f0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
e200: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
e210: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
e220: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
e230: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
e240: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e250: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
e260: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
e270: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
e280: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
e290: 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  }..    /* Drop t
e2a0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
e2b0: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
e2c0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e2d0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
e2e0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
e2f0: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
e300: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
e310: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e320: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e330: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
e340: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  K ){.      /* Th
e350: 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20  is could happen 
e360: 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d  with a network m
e370: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45  ount */.      tE
e380: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e390: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e3a0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
e3b0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
e3c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
e3d0: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
e3e0: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
e3f0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
e400: 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
e410: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
e420: 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
e430: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
e440: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
e450: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
e460: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
e470: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
e480: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
e490: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
e4a0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
e4b0: 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
e4c0: 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
e4d0: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
e4e0: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
e4f0: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
e500: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
e510: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
e520: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
e530: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
e540: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
e550: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
e560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
e570: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
e580: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
e590: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
e5a0: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
e5b0: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
e5c0: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
e5d0: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
e5e0: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
e5f0: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
e600: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
e610: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e620: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
e630: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
e640: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
e650: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
e660: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
e670: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
e680: 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
e690: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
e6a0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
e6b0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
e6c0: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
e6d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e6e0: 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
e6f0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
e700: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
e710: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
e720: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
e730: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
e740: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e750: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
e760: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
e770: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
e780: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
e790: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
e7a0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
e7b0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
e7c0: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
e7d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
e7e0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
e7f0: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
e800: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a  }.    }.  }.  ..
e810: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
e820: 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  BUG.  /* Set up 
e830: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d  the transaction-
e840: 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63  counter change c
e850: 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68  hecking flags wh
e860: 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69  en.  ** transiti
e870: 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41  oning from a SHA
e880: 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45  RED to a RESERVE
e890: 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61  D lock.  The cha
e8a0: 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48  nge.  ** from SH
e8b0: 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
e8c0: 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e   marks the begin
e8d0: 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c  ning of a normal
e8e0: 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72  .  ** write oper
e8f0: 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74  ation (not a hot
e900: 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
e910: 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  k)..  */.  if( r
e920: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
e930: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
e940: 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
e950: 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  .   && eFileLock
e960: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ==RESERVED_LOCK.
e970: 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e    ){.    pFile->
e980: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
e990: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  0;.    pFile->db
e9a0: 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
e9b0: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
e9c0: 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  rite = 1;.  }.#e
e9d0: 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d  ndif...  if( rc=
e9e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e9f0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
ea00: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
ea10: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
ea20: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
ea30: 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
ea40: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
ea50: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
ea60: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ea70: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
ea80: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
ea90: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
eaa0: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
eab0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
eac0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
ead0: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
eae0: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
eaf0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
eb00: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
eb10: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
eb20: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
eb30: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
eb40: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
eb50: 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20  ** Add the file 
eb60: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
eb70: 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70  by file handle p
eb80: 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72  File to the corr
eb90: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e  esponding.** pUn
eba0: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  used list..*/.st
ebb0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e  atic void setPen
ebc0: 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20  dingFd(unixFile 
ebd0: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
ebe0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
ebf0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
ec00: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
ec10: 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 50 72   *p = pFile->pPr
ec20: 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
ec30: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
ec40: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
ec50: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
ec60: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
ec70: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
ec80: 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
ec90: 75 73 65 64 20 3d 20 30 3b 0a 20 20 6e 55 6e 75  used = 0;.  nUnu
eca0: 73 65 64 46 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  sedFd++;.}../*.*
ecb0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
ecc0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
ecd0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
ece0: 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
ecf0: 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
ed00: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
ed10: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
ed20: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
ed30: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
ed40: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
ed50: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
ed60: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
ed70: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
ed80: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
ed90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
eda0: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49   no-op..** .** I
edb0: 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  f handleNFSUnloc
edc0: 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  k is true, then 
edd0: 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61  on downgrading a
ede0: 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  n EXCLUSIVE_LOCK
edf0: 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68   to SHARED.** th
ee00: 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20  e byte range is 
ee10: 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70  divided into 2 p
ee20: 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72  arts and the fir
ee30: 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63  st part is unloc
ee40: 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20  ked then.** set 
ee50: 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  to a read lock, 
ee60: 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70  then the other p
ee70: 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e  art is simply un
ee80: 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f  locked.  This wo
ee90: 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61  rks .** around a
eea0: 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20   bug in BSD NFS 
eeb0: 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e  lockd (also seen
eec0: 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b   on MacOSX 10.3+
eed0: 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20  ) that fails to 
eee0: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77  .** remove the w
eef0: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72  rite lock on a r
ef00: 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61  egion when a rea
ef10: 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a  d lock is set..*
ef20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
ef30: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
ef40: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
ef50: 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61  FileLock, int ha
ef60: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a  ndleNFSUnlock){.
ef70: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
ef80: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
ef90: 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
efa0: 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74  fo *pInode;.  st
efb0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
efc0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
efd0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
efe0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
eff0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
f000: 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25  d %d was %d(%d,%
f010: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
f020: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
f030: 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
f040: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f050: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
f060: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
f070: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
f080: 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70  ed,.      osGetp
f090: 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65  id(0)));..  asse
f0a0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
f0b0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
f0c0: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
f0d0: 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
f0e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f0f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
f100: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
f110: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
f120: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
f130: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
f140: 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
f150: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
f160: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
f170: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
f180: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
f190: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f1a0: 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
f1b0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
f1c0: 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
f1d0: 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
f1e0: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
f1f0: 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
f200: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
f210: 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
f220: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
f230: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
f240: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
f250: 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
f260: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
f270: 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
f280: 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
f290: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
f2a0: 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
f2b0: 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
f2c0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
f2d0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
f2e0: 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
f2f0: 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
f300: 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
f310: 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
f320: 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
f330: 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
f340: 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
f350: 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
f360: 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
f370: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
f380: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
f390: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
f3a0: 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
f3b0: 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
f3c0: 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
f3d0: 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
f3e0: 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
f3f0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
f400: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
f410: 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
f420: 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
f430: 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
f440: 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
f450: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
f460: 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
f470: 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
f480: 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
f490: 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
f4a0: 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
f4b0: 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
f4c0: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
f4d0: 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
f4e0: 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
f4f0: 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
f500: 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
f510: 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
f520: 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
f530: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
f540: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
f550: 43 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  CK ){.#if !defin
f560: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
f570: 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   !SQLITE_ENABLE_
f580: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
f590: 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65      (void)handle
f5a0: 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  NFSUnlock;.     
f5b0: 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e   assert( handleN
f5c0: 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23  FSUnlock==0 );.#
f5d0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
f5e0: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
f5f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
f600: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
f610: 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55    if( handleNFSU
f620: 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  nlock ){.       
f630: 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20   int tErrno;    
f640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
f650: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79  ror code from sy
f660: 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73  stem call errors
f670: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   */.        off_
f680: 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52  t divSize = SHAR
f690: 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20  ED_SIZE - 1;.   
f6a0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f       .        lo
f6b0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
f6c0: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
f6d0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
f6e0: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
f6f0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f700: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
f710: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f720: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
f730: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f740: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f750: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
f760: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f770: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
f780: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f790: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
f7a0: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f7b0: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
f7c0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
f7d0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
f7e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
f7f0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
f800: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
f810: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
f820: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
f830: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f840: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
f850: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f860: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
f870: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f880: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f890: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
f8a0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f8b0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
f8c0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f8d0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f8e0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f8f0: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
f900: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
f910: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
f920: 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
f930: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
f940: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
f950: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
f960: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
f970: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f980: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f990: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_UNLCK;.       
f9a0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f9b0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f9c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f9d0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64  = SHARED_FIRST+d
f9e0: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
f9f0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
fa00: 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65  RED_SIZE-divSize
fa10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
fa20: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
fa30: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
fa40: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
fa50: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
fa60: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
fa70: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
fa80: 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
fa90: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
faa0: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
fab0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
fac0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
fad0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
fae0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
faf0: 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
fb00: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
fb10: 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b  STYLE */.      {
fb20: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
fb30: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
fb40: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
fb50: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
fb60: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
fb70: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
fb80: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
fb90: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
fba0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  ED_SIZE;.       
fbb0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
fbc0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
fbd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
fbe0: 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
fbf0: 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c  all to unixFileL
fc00: 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  ock() cannot fai
fc10: 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65  l because anothe
fc20: 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  r.          ** p
fc30: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
fc40: 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  g an incompatibl
fc50: 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f  e lock. If it do
fc60: 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20  es, this .      
fc70: 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73      ** indicates
fc80: 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
fc90: 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
fca0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63  ollowing the loc
fcb0: 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  king.          *
fcc0: 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74  * protocol. If t
fcd0: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74  his happens, ret
fce0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
fcf0: 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69  _RDLOCK. Returni
fd00: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
fd10: 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c  SQLITE_BUSY woul
fd20: 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70  d confuse the up
fd30: 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72  per layer (in pr
fd40: 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73  actice it causes
fd50: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
fd60: 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c  n assert to fail
fd70: 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20  ). */ .         
fd80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
fd90: 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_RDLOCK;.     
fda0: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
fdb0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
fdc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
fdd0: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
fde0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
fdf0: 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
fe00: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
fe10: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
fe20: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
fe30: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
fe40: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
fe50: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
fe60: 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
fe70: 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
fe80: 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
fe90: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
fea0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
feb0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  )==0 ){.      pI
fec0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
fed0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
fee0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fef0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
ff00: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
ff10: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
ff20: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
ff30: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
ff40: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
ff50: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
ff60: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f  NO_LOCK ){.    /
ff70: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
ff80: 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
ff90: 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
ffa0: 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
ffb0: 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
ffc0: 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
ffd0: 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
ffe0: 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
fff0: 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
10000 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
10010 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
10020 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
10030 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
10040 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 ){.      lock.
10050 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
10060 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
10070 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
10080 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
10090 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65  tart = lock.l_le
100a0 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66  n = 0L;.      if
100b0 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
100c0 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20  File, &lock)==0 
100d0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
100e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
100f0 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
10100 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
10110 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
10120 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73  NLOCK;.        s
10130 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
10140 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
10150 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
10160 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
10170 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
10180 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
10190 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
101a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
101b0 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
101c0 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
101d0 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
101e0 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
101f0 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
10200 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
10210 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
10220 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
10230 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
10240 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
10250 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
10260 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
10270 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
10280 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
10290 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
102a0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
102b0 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
102c0 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
102d0 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
102e0 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b  .  }..end_unlock
102f0 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
10300 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
10310 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
10320 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
10330 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
10340 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10350 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
10360 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
10370 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
10380 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
10390 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
103a0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
103b0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
103c0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
103d0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
103e0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
103f0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
10400 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
10410 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10420 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
10430 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10440 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
10450 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
10460 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
10470 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
10480 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10490 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73  MMAP_SIZE>0.  as
104a0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
104b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
104c0 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29  ((unixFile *)id)
104d0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
104e0 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
104f0 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
10500 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b  , eFileLock, 0);
10510 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
10520 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73  AX_MMAP_SIZE>0.s
10530 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
10540 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
10550 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b  pFd, i64 nByte);
10560 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
10570 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
10580 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69  ile *pFd);.#endi
10590 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
105a0 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
105b0 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
105c0 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
105d0 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
105e0 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
105f0 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
10600 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
10610 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
10620 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
10630 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
10640 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
10650 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
10660 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
10670 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e  ..**.** It is *n
10680 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ot* necessary to
10690 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20   hold the mutex 
106a0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
106b0 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  e is called,.** 
106c0 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  even on VxWorks.
106d0 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62    A mutex will b
106e0 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78  e acquired on Vx
106f0 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20  Works by the.** 
10700 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
10710 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a  leId() routine..
10720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
10730 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
10740 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
10750 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
10760 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
10770 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
10780 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
10790 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
107a0 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  le);.#endif.  if
107b0 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
107c0 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
107d0 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
107e0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
107f0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
10800 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .  }.#if OS_VXWO
10810 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  RKS.  if( pFile-
10820 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20  >pId ){.    if( 
10830 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
10840 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45   & UNIXFILE_DELE
10850 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  TE ){.      osUn
10860 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d  link(pFile->pId-
10870 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
10880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f  ;.    }.    vxwo
10890 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
108a0 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20  (pFile->pId);.  
108b0 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
108c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
108d0 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e  def SQLITE_UNLIN
108e0 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20  K_AFTER_CLOSE.  
108f0 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
10900 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
10910 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73  DELETE ){.    os
10920 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50  Unlink(pFile->zP
10930 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
10940 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29  3_free(*(char**)
10950 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a  &pFile->zPath);.
10960 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68      pFile->zPath
10970 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
10980 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
10990 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
109a0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e  ile->h));.  Open
109b0 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
109c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
109d0 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  e->pPreallocated
109e0 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65  Unused);.  memse
109f0 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
10a00 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
10a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10a20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
10a30 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
10a40 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73  tic int unixClos
10a50 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10a60 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  id){.  int rc = 
10a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
10a80 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10a90 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
10aa0 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 46   verifyDbFile(pF
10ab0 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f  ile);.  unixUnlo
10ac0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
10ad0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
10ae0 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46  x();..  /* unixF
10af0 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c  ile.pInode is al
10b00 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e  ways valid here.
10b10 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69   Otherwise, a di
10b20 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20  fferent close.  
10b30 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e  ** routine (e.g.
10b40 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20   nolockClose()) 
10b50 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  would be called 
10b60 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  instead..  */.  
10b70 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
10b80 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c  Inode->nLock>0 |
10b90 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
10ba0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
10bb0 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
10bc0 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20  (pFile->pInode) 
10bd0 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
10be0 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
10bf0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
10c00 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
10c10 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
10c20 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
10c30 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74   just.    ** yet
10c40 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
10c50 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
10c60 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
10c70 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
10c80 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
10c90 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  to pInode->pUnus
10ca0 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
10cb0 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
10cc0 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a  ly closed .    *
10cd0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
10ce0 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
10cf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50  .    */.    setP
10d00 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
10d10 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e  .  }.  releaseIn
10d20 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
10d30 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
10d40 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78  File(id);.  unix
10d50 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
10d60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
10d80 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
10d90 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
10da0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2f 0a 0a 2f  ************/../
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 2a 2a 0a 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 2a 2a 20 4e 6f  ************* No
10e80 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op 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 2a 2a 0a 2a  **************.*
10eb0 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
10ec0 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
10ed0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
10ee0 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
10ef0 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
10f00 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
10f10 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
10f20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
10f30 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
10f40 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
10f50 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
10f60 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
10f70 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
10f80 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
10f90 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
10fa0 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
10fb0 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
10fc0 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
10fd0 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
10fe0 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
10ff0 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
11000 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
11010 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
11020 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
11030 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
11040 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
11050 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
11060 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
11070 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
11080 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
11090 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
110a0 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
110b0 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
110c0 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
110d0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
110e0 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
110f0 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
11100 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
11110 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
11120 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
11130 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11140 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
11150 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
11160 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
11170 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
11180 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
11190 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
111a0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
111b0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
111c0 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
111d0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
111e0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
111f0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
11200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11210 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
11220 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
11230 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
11240 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
11250 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
11260 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
11270 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
11280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11290 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
112a0 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
112b0 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
112c0 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
112d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
112e0 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
112f0 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
11300 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11310 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
11320 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11330 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
11340 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
11350 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
11360 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
11370 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
11380 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
11390 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
113a0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
113b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
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 2a 2a 2f 0a  **************/.
11410 0a 2f 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 2a 2a  ****************
11460 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
11480 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
11490 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
114a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
114c0 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
114d0 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
114e0 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20  he existence of 
114f0 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
11500 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61   files (really a
11510 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63   directory) to c
11520 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
11530 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
11540 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e  This works.** on
11550 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72   just about ever
11560 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61  y filesystem ima
11570 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ginable.  But th
11580 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20  ere are serious 
11590 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a  downsides:.**.**
115a0 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69      (1)  There i
115b0 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e  s zero concurren
115c0 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65  cy.  A single re
115d0 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20  ader blocks all 
115e0 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
115f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   connections fro
11600 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  m reading or wri
11610 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
11620 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
11630 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   An application 
11640 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c  crash or power l
11650 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74  oss can leave st
11660 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a  ale lock files.*
11670 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e  *         sittin
11680 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65  g around that ne
11690 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64  ed to be cleared
116a0 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a   manually..**.**
116b0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61   Nevertheless, a
116c0 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61   dotlock is an a
116d0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
116e0 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20  ng mode for use 
116f0 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c  if no.** other l
11700 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
11710 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
11720 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b  .** Dotfile lock
11730 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65  ing works by cre
11740 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63  ating a subdirec
11750 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65  tory in the same
11760 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a   directory as.**
11770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
11780 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
11790 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
117a0 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
117b0 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
117c0 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c  existence of a l
117d0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d  ock directory im
117e0 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49  plies an EXCLUSI
117f0 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74  VE lock.  All ot
11800 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65  her.** lock type
11810 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52  s (SHARED, RESER
11820 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72  VED, PENDING) ar
11830 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58  e mapped into EX
11840 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a  CLUSIVE..*/../*.
11850 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  ** The file suff
11860 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ix added to the 
11870 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61  data base filena
11880 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  me in order to c
11890 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  reate the.** loc
118a0 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a  k directory..*/.
118b0 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
118c0 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
118d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
118e0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
118f0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
11900 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
11910 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
11920 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
11930 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
11940 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
11950 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
11960 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
11970 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
11980 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
11990 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
119a0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
119b0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
119c0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
119d0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
119e0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
119f0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
11a00 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
11a10 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
11a20 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
11a30 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
11a40 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
11a50 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
11a60 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
11a70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
11a80 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
11a90 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
11aa0 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
11ab0 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
11ac0 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
11ad0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
11ae0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
11af0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11b00 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
11b10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11b20 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
11b30 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
11b40 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11b50 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
11b60 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11b70 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
11b80 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
11b90 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
11ba0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11bb0 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d 20  );.  reserved = 
11bc0 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74 20  osAccess((const 
11bd0 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
11be0 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29 3d  kingContext, 0)=
11bf0 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  =0;.  OSTRACE(("
11c00 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11c10 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
11c20 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
11c30 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
11c40 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
11c50 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
11c60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
11c70 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
11c80 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
11c90 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
11ca0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
11cb0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
11cc0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
11cd0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
11ce0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
11cf0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
11d00 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
11d10 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
11d20 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
11d30 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
11d40 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
11d50 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
11d60 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
11d70 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
11d80 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
11d90 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
11da0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
11db0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
11dc0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
11dd0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
11de0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
11df0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
11e00 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
11e10 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
11e20 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
11e30 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
11e40 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
11e50 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
11e60 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
11e70 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
11e80 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
11e90 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
11ea0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
11eb0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
11ec0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
11ed0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
11ee0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11ef0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11f00 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
11f10 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
11f20 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
11f30 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
11f40 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
11f50 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
11f60 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
11f70 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
11f80 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
11f90 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
11fa0 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
11fb0 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
11fc0 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
11fd0 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
11fe0 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
11ff0 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
12000 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
12010 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
12020 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12030 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
12040 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12050 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
12060 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
12070 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
12080 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
12090 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20  ntext;.  int rc 
120a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
120b0 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61   /* If we have a
120c0 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ny lock, then th
120d0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  e lock file alre
120e0 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c  ady exists.  All
120f0 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
12100 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75   do is adjust ou
12110 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  r internal recor
12120 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65  d of the lock le
12130 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  vel..  */.  if( 
12140 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12150 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20   > NO_LOCK ){.  
12160 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12170 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
12180 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70      /* Always up
12190 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61  date the timesta
121a0 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69  mp on the old fi
121b0 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56  le */.#ifdef HAV
121c0 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d  E_UTIME.    utim
121d0 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  e(zLockFile, NUL
121e0 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74  L);.#else.    ut
121f0 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  imes(zLockFile, 
12200 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
12210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12220 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12230 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
12240 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d  e lock */.  rc =
12250 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69   osMkdir(zLockFi
12260 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28  le, 0777);.  if(
12270 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   rc<0 ){.    /* 
12280 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
12290 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64  reate the lock d
122a0 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
122b0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
122c0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49  no;.    if( EEXI
122d0 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  ST == tErrno ){.
122e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
122f0 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
12300 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  se {.      rc = 
12310 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12320 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
12330 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
12340 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
12350 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
12360 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
12370 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
12380 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
12390 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
123a0 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20  rn rc;.  } .  . 
123b0 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
123c0 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
123d0 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
123e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
123f0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
12400 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12410 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
12420 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
12430 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
12440 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
12450 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
12460 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
12470 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
12480 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
12490 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
124a0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
124b0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
124c0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
124d0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
124e0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
124f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
12500 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
12510 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
12520 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
12530 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
12540 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
12550 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
12560 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
12570 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
12580 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
12590 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
125a0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
125b0 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
125c0 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
125d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
125e0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
125f0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
12600 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
12610 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
12620 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d=%d (dotlock)\n
12630 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
12640 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
12650 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
12660 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ock, osGetpid(0)
12670 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
12680 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
12690 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
126a0 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
126b0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
126c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
126d0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
126e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
126f0 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77    }..  /* To dow
12700 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65 64  ngrade to shared
12710 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20  , simply update 
12720 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74  our internal not
12730 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
12740 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20  lock state.  No 
12750 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74  need to mess wit
12760 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  h the file on di
12770 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  sk..  */.  if( e
12780 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12790 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
127a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
127b0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
127c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
127d0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  K;.  }.  .  /* T
127e0 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74  o fully unlock t
127f0 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c  he database, del
12800 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  ete the lock fil
12810 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  e */.  assert( e
12820 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
12830 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d  K );.  rc = osRm
12840 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a  dir(zLockFile);.
12850 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
12860 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
12870 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74 45  rrno;.    if( tE
12880 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a  rrno==ENOENT ){.
12890 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
128a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
128b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
128c0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
128d0 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
128e0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
128f0 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
12900 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
12910 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12920 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
12930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
12950 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73   a file.  Make s
12960 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  ure the lock has
12970 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62   been released b
12980 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a  efore closing..*
12990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
129a0 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
129b0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
129c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
129d0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
129e0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
129f0 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   );.  dotlockUnl
12a00 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
12a10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
12a20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
12a30 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75 72  ontext);.  retur
12a40 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
12a50 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  id);.}./********
12a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
12a70 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
12a80 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
12a90 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
12aa0 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2f 0a 0a 2f 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 2a 2a 0a 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 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
12b70 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
12b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b90 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
12ba0 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
12bb0 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
12bc0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
12bd0 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
12be0 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
12bf0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
12c00 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
12c10 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
12c20 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
12c30 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
12c40 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
12c50 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
12c60 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
12c70 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
12c80 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
12c90 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
12ca0 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
12cb0 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
12cc0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
12cd0 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
12ce0 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
12cf0 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
12d00 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
12d10 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
12d20 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
12d30 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
12d40 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
12d50 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
12d60 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
12d70 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
12d80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
12d90 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
12da0 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
12db0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12dc0 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79  YLE../*.** Retry
12dd0 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74   flock() calls t
12de0 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49  hat fail with EI
12df0 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49  NTR.*/.#ifdef EI
12e00 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72  NTR.static int r
12e10 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20  obust_flock(int 
12e20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  fd, int op){.  i
12e30 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
12e40 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20  = flock(fd,op); 
12e50 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
12e60 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
12e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
12e80 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f  else.# define ro
12e90 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20  bust_flock(a,b) 
12ea0 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69  flock(a,b).#endi
12eb0 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  f.     ../*.** T
12ec0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
12ed0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
12ee0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
12ef0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
12f00 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
12f10 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
12f20 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
12f30 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
12f40 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
12f50 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
12f60 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
12f70 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
12f80 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
12f90 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
12fa0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
12fb0 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
12fc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
12fd0 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
12fe0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
12ff0 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  t flockCheckRese
13000 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
13010 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
13020 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
13030 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13040 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
13050 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
13060 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13070 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
13080 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13090 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
130a0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
130b0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
130c0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a  rt( pFile );.  .
130d0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
130e0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
130f0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
13100 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
13110 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13120 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
13130 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
13140 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
13150 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
13160 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
13170 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
13180 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
13190 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d   ){.    /* attem
131a0 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  pt to get the lo
131b0 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  ck */.    int lr
131c0 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
131d0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
131e0 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
131f0 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
13200 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
13210 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
13220 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72  */.      lrc = r
13230 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
13240 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
13250 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29        if ( lrc )
13260 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
13270 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
13280 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b         /* unlock
13290 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20   failed with an 
132a0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
132b0 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f   lrc = SQLITE_IO
132c0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
132d0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
132e0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
132f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
13300 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
13310 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
13320 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
13330 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72  rno;.      reser
13340 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  ved = 1;.      /
13350 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  * someone else m
13360 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73  ight have it res
13370 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c  erved */.      l
13380 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
13390 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
133a0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
133b0 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  ERR_LOCK); .    
133c0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
133d0 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
133e0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
133f0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
13400 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
13410 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lrc;.      }.   
13420 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
13430 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
13440 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29  %d %d %d (flock)
13450 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
13460 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
13470 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
13480 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13490 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
134a0 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49   & 0xff) == SQLI
134b0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
134c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
134d0 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a      reserved=1;.
134e0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
134f0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
13500 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
13510 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
13520 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
13530 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
13540 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
13550 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
13560 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
13570 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
13580 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
13590 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
135a0 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
135b0 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
135c0 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
135d0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
135e0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
135f0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
13600 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
13610 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
13620 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
13630 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
13640 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
13650 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
13660 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
13670 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
13680 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
13690 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
136a0 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
136b0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
136c0 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
136d0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
136e0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
136f0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
13700 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
13710 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
13720 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
13730 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
13740 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
13750 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
13760 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
13770 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
13780 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13790 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
137a0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
137b0 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
137c0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
137d0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
137e0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
137f0 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65   flock() only re
13800 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43  ally support EXC
13810 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57  LUSIVE locks.  W
13820 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64  e track intermed
13830 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61  iate.** lock sta
13840 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  tes in the sqlit
13850 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
13860 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73  e, but all locks
13870 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62   SHARED or.** ab
13880 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45  ove are really E
13890 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61  XCLUSIVE locks a
138a0 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f  nd exclude all o
138b0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66  ther processes f
138c0 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68  rom.** access th
138d0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
138e0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
138f0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
13900 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
13910 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
13920 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
13930 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
13940 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
13950 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71  int flockLock(sq
13960 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13970 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13980 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13990 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
139a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
139b0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
139c0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
139d0 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
139e0 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
139f0 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
13a00 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
13a10 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
13a20 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
13a30 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
13a40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
13a50 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
13a60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
13a70 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
13a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13a90 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
13aa0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
13ab0 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72  ck */.  .  if (r
13ac0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
13ad0 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
13ae0 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20  LOCK_NB)) {.    
13af0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
13b00 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27  no;.    /* didn'
13b10 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
13b20 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  usy */.    rc = 
13b30 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13b40 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13b50 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
13b60 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
13b70 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
13b80 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
13b90 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
13ba0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
13bb0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
13bc0 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
13bd0 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
13be0 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ok */.    pFile-
13bf0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13c00 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53  leLock;.  }.  OS
13c10 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
13c20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29  %d %s %s (flock)
13c30 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
13c40 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
13c50 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
13c60 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
13c70 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
13c80 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  "));.#ifdef SQLI
13c90 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13ca0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
13cb0 28 20 28 72 63 20 26 20 30 78 66 66 29 20 3d 3d  ( (rc & 0xff) ==
13cc0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
13cd0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13ce0 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BUSY;.  }.#endi
13cf0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
13d00 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13d10 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  RORS */.  return
13d20 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c   rc;.}.../*.** L
13d30 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
13d40 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
13d50 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
13d60 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
13d70 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
13d80 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
13d90 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
13da0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
13db0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
13dc0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
13dd0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
13de0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
13df0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
13e00 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
13e10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13e20 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
13e30 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  nt flockUnlock(s
13e40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13e50 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
13e60 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
13e70 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13e80 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
13e90 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
13ea0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
13eb0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
13ec0 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
13ed0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
13ee0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
13ef0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
13f00 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
13f10 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
13f20 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
13f30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
13f40 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
13f50 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
13f60 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
13f70 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
13f80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13f90 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
13fa0 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
13fb0 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
13fc0 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
13fd0 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
13fe0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
13ff0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
14000 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
14010 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
14020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14030 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
14040 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
14050 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
14060 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
14070 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
14080 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
14090 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
140a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
140b0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
140c0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
140d0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
140e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
140f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
14100 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
14110 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14120 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
14130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14140 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
14150 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
14160 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
14170 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
14180 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61 73 73  ile *id) {.  ass
14190 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
141a0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  flockUnlock(id, 
141b0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75  NO_LOCK);.  retu
141c0 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
141d0 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  (id);.}..#endif 
141e0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
141f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
14200 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a  & !OS_VXWORK */.
14210 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
14220 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
14230 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c   flock lock impl
14240 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
14250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14260 0a 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 2a 2a 2f  ***************/
142b0 0a 0a 2f 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 2a  ****************
14300 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
14310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
14320 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65   Named Semaphore
14330 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
14340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14350 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  *.**.** Named se
14360 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
14370 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
14380 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  d on VxWorks..**
14390 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
143a0 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
143b0 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b  t-lock and flock
143c0 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c   in that it real
143d0 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f  ly only.** suppo
143e0 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  rts EXCLUSIVE lo
143f0 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73  cking.  Only a s
14400 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
14410 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  n read or write.
14420 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14430 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20  file at a time. 
14440 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f   This reduces po
14450 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65  tential concurre
14460 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65  ncy, but.** make
14470 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  s the lock imple
14480 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65  mentation much e
14490 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53  asier..*/.#if OS
144a0 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
144b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
144c0 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
144d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
144e0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
144f0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
14500 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
14510 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
14520 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
14530 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
14540 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
14550 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
14560 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
14570 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
14580 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
14590 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
145a0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
145b0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
145c0 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
145d0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
145e0 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65  nt semXCheckRese
145f0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
14600 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
14610 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
14620 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14630 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
14640 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
14650 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
14660 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
14670 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
14680 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
14690 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
146a0 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
146b0 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
146c0 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
146d0 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
146e0 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
146f0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
14700 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
14710 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
14720 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
14730 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
14740 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
14750 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
14760 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
14770 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
14780 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  .    sem_t *pSem
14790 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
147a0 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28  ->pSem;..    if(
147b0 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
147c0 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  m)==-1 ){.      
147d0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
147e0 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41  no;.      if( EA
147f0 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29  GAIN != tErrno )
14800 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14810 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
14820 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
14830 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
14840 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
14850 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  ;.        storeL
14860 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
14870 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
14880 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
14890 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
148a0 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65  has the lock whe
148b0 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c  n we are in NO_L
148c0 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  OCK */.        r
148d0 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65  eserved = (pFile
148e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48  ->eFileLock < SH
148f0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
14900 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
14910 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64       /* we could
14920 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77   have it if we w
14930 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ant it */.      
14940 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a  sem_post(pSem);.
14950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
14960 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
14970 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65 6d  CK %d %d %d (sem
14980 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14990 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
149a0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
149b0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
149c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
149d0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
149e0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
149f0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
14a00 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
14a10 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
14a20 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
14a30 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
14a40 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
14a50 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
14a60 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
14a70 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
14a80 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
14a90 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
14aa0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
14ab0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
14ac0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
14ad0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
14ae0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
14af0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
14b00 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
14b10 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
14b20 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
14b30 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
14b40 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
14b50 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
14b60 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
14b70 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
14b80 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
14b90 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
14ba0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
14bb0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
14bc0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
14bd0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
14be0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
14bf0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
14c00 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
14c10 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
14c20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14c30 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
14c40 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
14c50 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
14c60 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
14c70 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
14c80 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73   Semaphore locks
14c90 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
14ca0 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
14cb0 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
14cc0 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
14cd0 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
14ce0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
14cf0 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
14d00 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
14d10 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
14d20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
14d30 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
14d40 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
14d50 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
14d60 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
14d70 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14d80 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
14d90 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
14da0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
14db0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
14dc0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
14dd0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
14de0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
14df0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
14e00 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
14e10 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
14e20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14e30 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
14e40 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
14e50 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
14e60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14e70 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77  E_OK;..  /* if w
14e80 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
14e90 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
14ea0 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
14eb0 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
14ec0 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
14ed0 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
14ee0 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
14ef0 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  ck > NO_LOCK) {.
14f00 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
14f10 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
14f20 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
14f30 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73  E_OK;.    goto s
14f40 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
14f50 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65  .  .  /* lock se
14f60 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20  maphore now but 
14f70 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c  bail out when al
14f80 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f  ready locked. */
14f90 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61  .  if( sem_trywa
14fa0 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
14fb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14fc0 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73  BUSY;.    goto s
14fd0 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
14fe0 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73  ..  /* got it, s
14ff0 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
15000 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
15010 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15020 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73  = eFileLock;.. s
15030 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72  em_end_lock:.  r
15040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15050 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
15060 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
15070 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
15080 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
15090 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
150a0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
150b0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
150c0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
150d0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
150e0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
150f0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
15100 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
15110 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
15120 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
15130 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15140 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
15150 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63  ic int semXUnloc
15160 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15170 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
15180 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
15190 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
151a0 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20  le*)id;.  sem_t 
151b0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
151c0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20  Inode->pSem;..  
151d0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
151e0 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20  .  assert( pSem 
151f0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
15200 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
15210 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29   %d pid=%d (sem)
15220 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
15230 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
15240 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
15250 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
15260 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
15270 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
15280 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
15290 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
152a0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
152b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
152c0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
152d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
152e0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
152f0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
15300 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
15310 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
15320 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
15330 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
15340 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
15350 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15360 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
15370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15380 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
15390 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63  no, really unloc
153a0 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d  k. */.  if ( sem
153b0 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20  _post(pSem)==-1 
153c0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20  ) {.    int rc, 
153d0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
153e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
153f0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
15400 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
15410 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
15420 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
15430 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
15440 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
15450 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
15460 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
15470 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
15480 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15490 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
154a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
154b0 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
154c0 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
154d0 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28  c int semXClose(
154e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
154f0 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
15500 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
15510 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
15520 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c  )id;.    semXUnl
15530 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
15540 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
15550 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45  ile );.    unixE
15560 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
15570 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
15580 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e  o(pFile);.    un
15590 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
155a0 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c      closeUnixFil
155b0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
155c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
155d0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
155e0 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20  XWORKS */./*.** 
155f0 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
15600 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
15610 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57  available on VxW
15620 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  orks..**.*******
15630 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
15640 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68  the named semaph
15650 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ore lock impleme
15660 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
15670 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2f 0a 0a 0a 2f 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 2a 2a 0a 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 2a 2a 20 42 65 67 69 6e 20 41 46 50  ****** Begin AFP
15740 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
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 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
15770 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c   AFP is the Appl
15780 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f  e Filing Protoco
15790 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74  l.  AFP is a net
157a0 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20  work filesystem 
157b0 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c  found.** on Appl
157c0 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70  e Macintosh comp
157d0 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39  uters - both OS9
157e0 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20   and OSX..**.** 
157f0 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c  Third-party impl
15800 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41  ementations of A
15810 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  FP are available
15820 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65  .  But this code
15830 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f   here.** only wo
15840 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a  rks on OSX..*/..
15850 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
15860 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
15870 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
15880 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  STYLE./*.** The 
15890 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
158a0 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  t structure cont
158b0 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63  ains all afp loc
158c0 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  k specific state
158d0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
158e0 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
158f0 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  text afpLockingC
15900 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61  ontext;.struct a
15910 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
15920 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65   {.  int reserve
15930 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
15940 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
15950 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15960 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
15970 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65  .};..struct Byte
15980 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20  RangeLockPB2.{. 
15990 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
159a0 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20  ong offset;     
159b0 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20     /* offset to 
159c0 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f  first byte to lo
159d0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
159e0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
159f0 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72  h;        /* nbr
15a00 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
15a10 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
15a20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e  long long retRan
15a30 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20  geStart; /* nbr 
15a40 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b  of 1st byte lock
15a50 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
15a60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
15a70 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20  har unLockFlag; 
15a80 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75          /* 1 = u
15a90 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20  nlock, 0 = lock 
15aa0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
15ab0 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b  ar startEndFlag;
15ac0 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20         /* 1=rel 
15ad0 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20  to end of fork, 
15ae0 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a  0=rel to start *
15af0 2f 0a 20 20 69 6e 74 20 66 64 3b 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 20 20 2f 2a 20 66 69 6c 65 20 64 65        /* file de
15b20 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73  sc to assoc this
15b30 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b   lock with */.};
15b40 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42  ..#define afpfsB
15b50 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
15b60 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28  TL        _IOWR(
15b70 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
15b80 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
15b90 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  )../*.** This is
15ba0 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73   a utility for s
15bb0 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69  etting or cleari
15bc0 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c  ng a bit-range l
15bd0 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50  ock on an.** AFP
15be0 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20   filesystem..** 
15bf0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
15c00 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c  E_OK on success,
15c10 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20   SQLITE_BUSY on 
15c20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
15c30 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63  ic int afpSetLoc
15c40 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  k(.  const char 
15c50 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  *path,          
15c60 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
15c70 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f  he file to be lo
15c80 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64  cked or unlocked
15c90 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
15ca0 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
15cb0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
15cc0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
15cd0 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  path */.  unsign
15ce0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
15cf0 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  set,     /* Firs
15d00 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
15d10 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ked */.  unsigne
15d20 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
15d30 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  th,     /* Numbe
15d40 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
15d50 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c  ck */.  int setL
15d60 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20  ockFlag         
15d70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
15d80 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c  o set lock.  Fal
15d90 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b  se to clear lock
15da0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
15db0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
15dc0 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a   pb;.  int err;.
15dd0 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c    .  pb.unLockFl
15de0 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67  ag = setLockFlag
15df0 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73   ? 0 : 1;.  pb.s
15e00 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b  tartEndFlag = 0;
15e10 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f  .  pb.offset = o
15e20 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67  ffset;.  pb.leng
15e30 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20  th = length; .  
15e40 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  pb.fd = pFile->h
15e50 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28  ;.  .  OSTRACE((
15e60 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d  "AFPSETLOCK [%s]
15e70 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e   for %d%s in ran
15e80 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c  ge %llx:%llx\n",
15e90 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c   .    (setLockFl
15ea0 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20  ag?"ON":"OFF"), 
15eb0 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64  pFile->h, (pb.fd
15ec0 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31  ==-1?"[testval-1
15ed0 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73  ]":""),.    offs
15ee0 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20  et, length));.  
15ef0 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68  err = fsctl(path
15f00 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  , afpfsByteRange
15f10 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c  Lock2FSCTL, &pb,
15f20 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d   0);.  if ( err=
15f30 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
15f40 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  rc;.    int tErr
15f50 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
15f60 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54  OSTRACE(("AFPSET
15f70 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66  LOCK failed to f
15f80 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25  sctl() '%s' %d %
15f90 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
15fa0 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c     path, tErrno,
15fb0 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f   strerror(tErrno
15fc0 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  )));.#ifdef SQLI
15fd0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
15fe0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63  CK_ERRORS.    rc
15ff0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
16000 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73  #else.    rc = s
16010 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
16020 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
16030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16040 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67       setLockFlag
16050 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   ? SQLITE_IOERR_
16060 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f  LOCK : SQLITE_IO
16070 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e  ERR_UNLOCK);.#en
16080 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
16090 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
160a0 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20  RORS */.    if( 
160b0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
160c0 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
160d0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
160e0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
160f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16100 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
16110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16120 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
16130 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
16140 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
16150 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
16160 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
16170 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
16180 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
16190 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
161a0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
161b0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
161c0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
161d0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
161e0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
161f0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
16200 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
16210 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
16220 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
16230 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
16240 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
16250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16260 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
16270 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
16280 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
16290 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
162a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
162b0 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
162c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
162d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
162e0 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
162f0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b  ontext *context;
16300 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
16310 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
16320 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
16330 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
16340 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
16350 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74  ile );.  context
16360 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
16370 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
16380 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
16390 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72    if( context->r
163a0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a  eserved ){.    *
163b0 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20  pResOut = 1;.   
163c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
163d0 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
163e0 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
163f0 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
16400 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
16410 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
16420 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
16430 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
16440 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
16450 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
16460 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
16470 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
16480 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
16490 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
164a0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
164b0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
164c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
164d0 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
164e0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
164f0 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
16500 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20  e RESERVED byte 
16510 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
16520 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16530 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16540 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
16550 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69  E, 1,1);  .    i
16560 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72  f( SQLITE_OK==lr
16570 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  c ){.      /* if
16580 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
16590 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65   taking the rese
165a0 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63  rved lock, unloc
165b0 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a  k it to restore.
165c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
165d0 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20  ginal state */. 
165e0 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65       lrc = afpSe
165f0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16600 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
16610 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
16620 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  0);.    } else {
16630 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
16640 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
16650 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
16660 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
16670 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
16680 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
16690 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
166a0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
166b0 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20  .      rc=lrc;. 
166c0 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
166d0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
166e0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
166f0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
16700 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
16710 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
16720 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
16730 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
16740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16750 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
16760 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
16770 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
16780 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
16790 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
167a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
167b0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
167c0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
167d0 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
167e0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
167f0 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
16800 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
16810 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
16820 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
16830 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
16840 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
16850 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
16860 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
16870 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
16880 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
16890 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
168a0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
168b0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
168c0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
168d0 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
168e0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
168f0 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
16900 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
16910 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
16920 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
16930 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
16940 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
16950 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
16960 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
16970 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
16980 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
16990 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
169a0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
169b0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
169c0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
169d0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
169e0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
169f0 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
16a00 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
16a10 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
16a20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
16a30 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
16a40 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
16a50 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
16a60 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
16a70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
16a80 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
16a90 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
16aa0 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
16ab0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16ac0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16ad0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
16ae0 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
16af0 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
16b00 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
16b10 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
16b20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
16b30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
16b40 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
16b50 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
16b60 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
16b70 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
16b80 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
16b90 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
16ba0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
16bb0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
16bc0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
16bd0 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
16be0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
16bf0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
16c00 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
16c10 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
16c20 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65  ->nShared , osGe
16c30 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a  tpid(0)));..  /*
16c40 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
16c50 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
16c60 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
16c70 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
16c80 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
16c90 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
16ca0 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
16cb0 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
16cc0 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
16cd0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
16ce0 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
16cf0 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
16d00 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
16d10 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
16d20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
16d30 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
16d40 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
16d50 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
16d60 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
16d70 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
16d80 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ck)));.    retur
16d90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16da0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
16db0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
16dc0 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
16dd0 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
16de0 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
16df0 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
16e00 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
16e10 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
16e20 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
16e30 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
16e40 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
16e50 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
16e60 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
16e70 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
16e80 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
16e90 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
16ea0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
16eb0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
16ec0 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
16ed0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16ee0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
16ef0 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
16f00 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
16f10 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
16f20 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
16f30 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16f40 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
16f50 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  .  .  /* This mu
16f60 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
16f70 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
16f80 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
16f90 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
16fa0 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
16fb0 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
16fc0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
16fd0 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
16fe0 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
16ff0 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
17000 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
17010 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
17020 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
17030 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
17040 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
17050 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
17060 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
17070 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  k!=pInode->eFile
17080 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20  Lock && .       
17090 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
170a0 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
170b0 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
170c0 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20  ARED_LOCK)).    
170d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
170e0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
170f0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
17100 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
17110 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
17120 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
17130 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
17140 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
17150 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
17160 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
17170 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
17180 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
17190 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
171a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
171b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
171c0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
171d0 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49  OCK && .     (pI
171e0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
171f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
17200 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17210 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
17220 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
17230 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
17240 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
17250 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
17260 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
17270 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
17280 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
17290 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
172a0 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
172b0 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
172c0 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
172d0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
172e0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
172f0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20  lock;.  }.    . 
17300 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
17310 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
17320 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
17330 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
17340 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
17350 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
17360 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
17370 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
17380 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
17390 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
173a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
173b0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
173c0 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
173d0 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
173e0 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
173f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
17400 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
17410 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a      int failed;.
17420 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
17430 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17440 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17450 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
17460 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69   1);.    if (fai
17470 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20  led) {.      rc 
17480 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  = failed;.      
17490 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
174a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  k;.    }.  }.  .
174b0 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
174c0 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
174d0 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
174e0 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
174f0 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
17500 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
17510 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
17520 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
17530 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
17540 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
17550 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c   int lrc1, lrc2,
17560 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a   lrc1Errno = 0;.
17570 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73      long lk, mas
17580 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65  k;.    .    asse
17590 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
175a0 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
175b0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
175c0 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
175d0 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20        .    mask 
175e0 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d  = (sizeof(long)=
175f0 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e  =8) ? LARGEST_IN
17600 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66 66  T64 : 0x7fffffff
17610 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ;.    /* Now get
17620 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53   the read-lock S
17630 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  HARED_LOCK */.  
17640 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74    /* note that t
17650 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68  he quality of th
17660 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65  e randomness doe
17670 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74  sn't matter that
17680 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20   much */.    lk 
17690 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20  = random(); .   
176a0 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
176b0 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b  yte = (lk & mask
176c0 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d  )%(SHARED_SIZE -
176d0 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20   1);.    lrc1 = 
176e0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
176f0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17700 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48  e, .          SH
17710 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
17720 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
17730 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53  , 1);.    if( IS
17740 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
17750 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45  ) ){.      lrc1E
17760 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  rrno = pFile->la
17770 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  stErrno;.    }. 
17780 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
17790 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
177a0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63   lock */.    lrc
177b0 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
177c0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
177d0 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
177e0 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
177f0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
17800 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b  _ERROR(lrc1) ) {
17810 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
17820 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63  Errno(pFile, lrc
17830 31 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72  1Errno);.      r
17840 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20  c = lrc1;.      
17850 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
17860 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
17870 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
17880 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72  lrc2) ){.      r
17890 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20  c = lrc2;.      
178a0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
178b0 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
178c0 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45  ( lrc1 != SQLITE
178d0 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63  _OK ) {.      rc
178e0 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65   = lrc1;.    } e
178f0 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  lse {.      pFil
17900 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
17910 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
17920 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
17930 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
17940 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
17950 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17960 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
17970 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
17980 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
17990 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
179a0 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
179b0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
179c0 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
179d0 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20  in this.     ** 
179e0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
179f0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
17a00 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
17a10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17a20 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
17a30 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
17a40 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
17a50 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
17a60 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
17a70 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
17a80 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
17a90 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
17aa0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
17ab0 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
17ac0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
17ad0 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
17ae0 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
17af0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
17b00 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b     if (eFileLock
17b10 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
17b20 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
17b30 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44  eLock < RESERVED
17b40 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
17b50 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
17b60 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
17b70 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
17b80 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17b90 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17ba0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
17bb0 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66  , 1,1);.      if
17bc0 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  ( !failed ){.   
17bd0 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
17be0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
17bf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
17c00 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69   (!failed && eFi
17c10 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53  leLock == EXCLUS
17c20 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
17c30 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
17c40 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
17c50 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
17c60 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
17c70 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
17c80 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
17c90 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
17ca0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
17cb0 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
17cc0 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
17cd0 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
17ce0 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
17cf0 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69  .      if( !(fai
17d00 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
17d10 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17d20 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
17d30 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
17d60 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20  yte, 1, 0)) ){. 
17d70 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65         int faile
17d80 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  d2 = SQLITE_OK;.
17d90 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61          /* now a
17da0 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74  ttemmpt to get t
17db0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
17dc0 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20  k range */.     
17dd0 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
17de0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17df0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
17e00 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_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 20 20 53 48 41               SHA
17e30 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20  RED_SIZE, 1);.  
17e40 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64        if( failed
17e50 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61   && (failed2 = a
17e60 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17e70 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17e80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17e90 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
17ea0 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d  _FIRST + pInode-
17eb0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
17ec0 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  1)) ){.         
17ed0 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61   /* Can't reesta
17ee0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
17ef0 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63   lock.  Sqlite c
17f00 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20  an't deal, this 
17f10 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
17f20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65  a critical I/O e
17f30 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
17f40 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
17f50 20 28 28 66 61 69 6c 65 64 20 26 20 30 78 66 66   ((failed & 0xff
17f60 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
17f70 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17f90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
17fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
17fb0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
17fc0 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
17fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
17fe0 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
17ff0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
18000 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
18010 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
18020 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
18030 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18040 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
18050 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
18060 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
18070 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
18080 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
18090 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
180a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
180b0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
180c0 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
180d0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
180e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
180f0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
18100 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
18110 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
18120 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
18130 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
18140 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
18150 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
18160 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
18170 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
18180 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
18190 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
181a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
181b0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
181c0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
181d0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
181e0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
181f0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
18200 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
18210 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
18220 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
18230 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
18240 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
18250 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
18260 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
18270 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
18280 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
18290 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
182a0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
182b0 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
182c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
182d0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
182e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
182f0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
18300 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
18310 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
18320 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
18330 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
18340 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
18350 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
18360 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
18370 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
18380 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
18390 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
183a0 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
183b0 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
183c0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
183d0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
183e0 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
183f0 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
18400 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
18410 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
18420 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
18430 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18440 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
18450 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
18460 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
18470 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
18480 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
18490 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
184a0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
184b0 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
184c0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
184d0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
184e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
184f0 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
18500 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
18510 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
18520 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
18530 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
18540 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
18550 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
18560 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
18570 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
18580 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
18590 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69  leLock );.    Si
185a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
185b0 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
185c0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
185d0 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
185e0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
185f0 30 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20  0);.    .#ifdef 
18600 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
18610 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
18620 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
18630 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
18640 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
18650 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
18660 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
18670 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
18680 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
18690 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
186a0 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
186b0 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
186c0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
186d0 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
186e0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
186f0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
18700 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
18710 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
18720 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
18730 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
18740 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
18750 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
18760 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
18770 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
18780 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
18790 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
187a0 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
187b0 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
187c0 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
187d0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
187e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
187f0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
18800 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
18810 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
18820 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
18830 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
18840 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
18850 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
18860 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
18870 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
18880 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18890 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
188a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
188b0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
188c0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
188d0 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
188e0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
188f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
18900 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
18910 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18920 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
18930 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20  nShared>1) ){.  
18940 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
18950 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
18960 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
18970 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
18980 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
18990 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
189a0 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
189b0 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20  redByte;.       
189c0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
189d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
189e0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
189f0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
18a00 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
18a10 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65         skipShare
18a20 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
18a30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
18a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
18a50 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
18a60 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
18a70 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18a80 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18a90 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
18aa0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
18ab0 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
18ac0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18ad0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
18ae0 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
18af0 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72  CK && context->r
18b00 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20  eserved ){.     
18b10 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18b20 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18b30 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
18b40 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
18b50 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20       if( !rc ){ 
18b60 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
18b70 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20  ->reserved = 0; 
18b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18b90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18ba0 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
18bb0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18bc0 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
18bd0 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49  ed>1)){.      pI
18be0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
18bf0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
18c00 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
18c10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18c20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
18c30 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
18c40 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
18c50 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
18c60 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
18c70 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
18c80 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
18c90 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
18ca0 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
18cb0 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
18cc0 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
18cd0 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
18ce0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
18cf0 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
18d00 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
18d10 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
18d20 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  yte;.    pInode-
18d30 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
18d40 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
18d50 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
18d60 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18d70 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
18d80 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18d90 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
18da0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18db0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
18dc0 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
18dd0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18de0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18df0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18e00 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
18e10 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
18e20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
18e30 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
18e40 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
18e50 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
18e60 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18e70 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
18e80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18e90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18ea0 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
18eb0 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
18ec0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
18ed0 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
18ee0 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
18ef0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
18f00 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
18f10 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
18f20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  }.    }.  }.  . 
18f30 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
18f40 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18f50 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
18f60 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
18f70 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
18f80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
18f90 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61  se a file & clea
18fa0 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63  nup AFP specific
18fb0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
18fc0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
18fd0 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  afpClose(sqlite3
18fe0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
18ff0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19000 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
19010 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
19020 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
19030 69 64 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e  id!=0 );.  afpUn
19040 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
19050 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
19060 74 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69  tex();.  if( pFi
19070 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46  le->pInode && pF
19080 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
19090 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ck ){.    /* If 
190a0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
190b0 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
190c0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
190d0 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
190e0 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61  .    ** yet beca
190f0 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
19100 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
19110 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
19120 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
19130 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
19140 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  node->aPending. 
19150 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
19160 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
19170 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   when.    ** the
19180 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
19190 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
191a0 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
191b0 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
191c0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
191d0 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
191e0 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
191f0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72  ingContext);.  r
19200 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
19210 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
19220 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
19230 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
19240 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
19250 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
19260 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
19270 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
19280 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
19290 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  s the AFP lock i
192a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
192b0 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
192c0 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
192d0 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
192e0 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
192f0 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
19300 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
19310 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49  is available.  I
19320 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70  f you don't comp
19330 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74  ile for a mac, t
19340 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66  hen the "unix-af
19350 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74  p".** VFS is not
19360 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
19370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19380 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
19390 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
193a0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
193b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2f 0a 0a  *************/..
19410 2f 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 2a 2a 0a  ***************.
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 2a 2a 20 42 65 67 69  *********** Begi
19480 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n 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 2a 2a 2f 0a  **************/.
194b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
194c0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
194d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
194e0 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f  _STYLE./*. ** Lo
194f0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
19500 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
19510 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
19520 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
19530 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74  ileLock. ** must
19540 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
19550 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
19560 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68  K.. **. ** If th
19570 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
19580 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
19590 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
195a0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a  y at or below. *
195b0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
195c0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
195d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
195e0 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74   no-op.. */.stat
195f0 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b  ic int nfsUnlock
19600 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19610 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
19620 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  ){.  return posi
19630 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
19640 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65  eLock, 1);.}..#e
19650 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
19660 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
19670 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
19680 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
19690 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
196a0 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63  e is the NFS loc
196b0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
196c0 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
196d0 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
196e0 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
196f0 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
19700 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
19710 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
19720 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
19730 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    .**.**********
19740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
19750 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  of the NFS lock 
19760 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
19770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19780 2a 2a 2a 2a 2a 0a 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 2a 2a 2f 0a 0a 2f 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 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
19830 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b  ******* Non-lock
19840 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ing sqlite3_file
19850 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
19860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19870 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
19880 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63   next division c
19890 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e  ontains implemen
198a0 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20  tations for all 
198b0 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a  methods of the .
198c0 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
198d0 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61  object other tha
198e0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  n the locking me
198f0 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b  thods.  The lock
19900 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77  ing.** methods w
19910 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64  ere defined in d
19920 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28  ivisions above (
19930 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  one locking meth
19940 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69  od per.** divisi
19950 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68  on).  Those meth
19960 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ods that are com
19970 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
19980 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20  ng modes.** are 
19990 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20  gather together 
199a0 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69  into this divisi
199b0 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  on..*/../*.** Se
199c0 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
199d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
199e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
199f0 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a  then read cnt .*
19a00 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  * bytes into pBu
19a10 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  f. Return the nu
19a20 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
19a30 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a  tually read..**.
19a40 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64  ** NB:  If you d
19a50 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20  efine USE_PREAD 
19a60 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20  or USE_PREAD64, 
19a70 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c  then it might al
19a80 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  so.** be necessa
19a90 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  ry to define _XO
19aa0 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65  PEN_SOURCE to be
19ab0 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69   500.  This vari
19ac0 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73  es from.** one s
19ad0 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72  ystem to another
19ae0 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20  .  Since SQLite 
19af0 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20  does not define 
19b00 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20  USE_PREAD.** in 
19b10 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61  any form by defa
19b20 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74  ult, we will not
19b30 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69   attempt to defi
19b40 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
19b50 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73  ..** See tickets
19b60 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31   #2741 and #2681
19b70 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
19b80 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
19b90 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
19ba0 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c  ailed read the l
19bb0 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
19bc0 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
19bd0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
19be0 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
19bf0 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
19c00 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
19c10 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
19c20 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
19c30 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20   int got;.  int 
19c40 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28  prior = 0;.#if (
19c50 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
19c60 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
19c70 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
19c80 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
19c90 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
19ca0 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ART;.  assert( c
19cb0 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66  nt==(cnt&0x1ffff
19cc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
19cd0 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a  d->h>2 );.  do{.
19ce0 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
19cf0 50 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d  PREAD).    got =
19d00 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20   osPread(id->h, 
19d10 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
19d20 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  t);.    Simulate
19d30 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
19d40 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
19d50 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
19d60 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61      got = osPrea
19d70 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
19d80 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
19d90 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19da0 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
19db0 23 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66  #else.    newOff
19dc0 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
19dd0 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
19de0 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
19df0 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
19e00 66 73 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20  fset = -1 );.   
19e10 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30   if( newOffset<0
19e20 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
19e30 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
19e40 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a  le*)id, errno);.
19e50 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
19e60 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d  .    }.    got =
19e70 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70   osRead(id->h, p
19e80 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69  Buf, cnt);.#endi
19e90 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63  f.    if( got==c
19ea0 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nt ) break;.    
19eb0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
19ec0 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49     if( errno==EI
19ed0 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20  NTR ){ got = 1; 
19ee0 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20  continue; }.    
19ef0 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20    prior = 0;.   
19f00 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
19f10 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  o((unixFile*)id,
19f20 20 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20    errno);.      
19f30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
19f40 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20   if( got>0 ){.  
19f50 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a      cnt -= got;.
19f60 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
19f70 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  got;.      prior
19f80 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70   += got;.      p
19f90 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f  Buf = (void*)(go
19fa0 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29  t + (char*)pBuf)
19fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
19fc0 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d  ( got>0 );.  TIM
19fd0 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43  ER_END;.  OSTRAC
19fe0 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64  E(("READ    %-3d
19ff0 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
1a000 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1a010 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72  id->h, got+prior
1a020 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20  , offset-prior, 
1a030 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
1a040 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72  .  return got+pr
1a050 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ior;.}../*.** Re
1a060 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
1a070 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
1a080 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
1a090 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
1a0a0 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
1a0b0 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
1a0c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
1a0d0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1a0e0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
1a0f0 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a  c int unixRead(.
1a100 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1a110 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75  id, .  void *pBu
1a120 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
1a130 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1a140 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46  ffset.){.  unixF
1a150 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1a160 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
1a170 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
1a180 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
1a190 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20  ( offset>=0 );. 
1a1a0 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
1a1b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1a1c0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
1a1d0 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
1a1e0 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
1a1f0 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
1a200 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
1a210 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
1a220 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
1a230 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
1a240 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
1a250 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
1a260 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
1a270 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  sed==0.       ||
1a280 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47   offset>=PENDING
1a290 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20  _BYTE+512.      
1a2a0 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d   || offset+amt<=
1a2b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20  PENDING_BYTE .  
1a2c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  );.#endif..#if S
1a2d0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1a2e0 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
1a2f0 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
1a300 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73  this read reques
1a310 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
1a320 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
1a330 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
1a340 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
1a350 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
1a360 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1a370 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1a380 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
1a390 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
1a3a0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1a3b0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
1a3c0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1a3d0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1a3e0 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  et], amt);.     
1a3f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a400 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1a410 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1a420 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1a430 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1a440 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
1a450 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1a460 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1a470 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  ], nCopy);.     
1a480 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
1a490 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
1a4a0 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
1a4b0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
1a4c0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
1a4d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74   }.#endif..  got
1a4e0 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
1a4f0 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42  File, offset, pB
1a500 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20  uf, amt);.  if( 
1a510 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20  got==amt ){.    
1a520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a530 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f  ;.  }else if( go
1a540 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61  t<0 ){.    /* la
1a550 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1a560 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20  eekAndRead */.  
1a570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a580 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65  IOERR_READ;.  }e
1a590 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61  lse{.    storeLa
1a5a0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30  stErrno(pFile, 0
1a5b0 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79  );   /* not a sy
1a5c0 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1a5d0 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
1a5e0 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
1a5f0 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
1a600 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
1a610 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
1a620 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
1a630 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
1a640 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1a650 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
1a660 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1a670 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65  seek the file-de
1a680 73 63 72 69 70 74 6f 72 20 70 61 73 73 65 64 20  scriptor passed 
1a690 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1a6a0 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f  ument to.** abso
1a6b0 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66  lute offset iOff
1a6c0 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74  , then attempt t
1a6d0 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62 79 74  o write nBuf byt
1a6e0 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a  es of data from.
1a6f0 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49  ** pBuf to it. I
1a700 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1a710 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64  s, return -1 and
1a720 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f   set *piErrno. O
1a730 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65  therwise, .** re
1a740 74 75 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20  turn the actual 
1a750 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1a760 77 72 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d  written (which m
1a770 61 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a  ay be less than.
1a780 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61  ** nBuf)..*/.sta
1a790 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
1a7a0 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64  riteFd(.  int fd
1a7b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1a7d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1a7e0 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36  write to */.  i6
1a7f0 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20  4 iOff,         
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a810 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20   File offset to 
1a820 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
1a830 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1a840 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
1a850 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61        /* Copy da
1a860 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66  ta from this buf
1a870 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20  fer to the file 
1a880 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c 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 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a8b0 62 75 66 66 65 72 20 70 42 75 66 20 69 6e 20 62  buffer pBuf in b
1a8c0 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ytes */.  int *p
1a8d0 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20  iErrno          
1a8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1a8f0 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69  : Error number i
1a900 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a  f error occurs *
1a910 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1a920 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a930 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1a940 72 65 74 75 72 6e 65 64 20 62 79 20 73 79 73 74  returned by syst
1a950 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73  em call */..  as
1a960 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75  sert( nBuf==(nBu
1a970 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20  f&0x1ffff) );.  
1a980 61 73 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a  assert( fd>2 );.
1a990 20 20 61 73 73 65 72 74 28 20 70 69 45 72 72 6e    assert( piErrn
1a9a0 6f 21 3d 30 20 29 3b 0a 20 20 6e 42 75 66 20 26  o!=0 );.  nBuf &
1a9b0 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d  = 0x1ffff;.  TIM
1a9c0 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64  ER_START;..#if d
1a9d0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1a9e0 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e  ).  do{ rc = (in
1a9f0 74 29 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70  t)osPwrite(fd, p
1aa00 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29  Buf, nBuf, iOff)
1aa10 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
1aa20 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1aa30 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1aa40 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64  USE_PREAD64).  d
1aa50 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50  o{ rc = (int)osP
1aa60 77 72 69 74 65 36 34 28 66 64 2c 20 70 42 75 66  write64(fd, pBuf
1aa70 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77  , nBuf, iOff);}w
1aa80 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1aa90 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c  rno==EINTR);.#el
1aaa0 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34  se.  do{.    i64
1aab0 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66   iSeek = lseek(f
1aac0 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45  d, iOff, SEEK_SE
1aad0 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
1aae0 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 20 3d  IOError( iSeek =
1aaf0 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69   -1 );.    if( i
1ab00 53 65 65 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20  Seek<0 ){.      
1ab10 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62  rc = -1;.      b
1ab20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ab30 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
1ab40 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20   pBuf, nBuf);.  
1ab50 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1ab60 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
1ab70 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f  #endif..  TIMER_
1ab80 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  END;.  OSTRACE((
1ab90 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
1aba0 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
1abb0 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54   fd, rc, iOff, T
1abc0 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
1abd0 0a 20 20 69 66 28 20 72 63 3c 30 20 29 20 2a 70  .  if( rc<0 ) *p
1abe0 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  iErrno = errno;.
1abf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ac00 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
1ac10 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d  he offset in id-
1ac20 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61  >offset then rea
1ac30 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f  d cnt bytes into
1ac40 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e   pBuf..** Return
1ac50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1ac60 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
1ac70 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20  ad.  Update the 
1ac80 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f  offset..**.** To
1ac90 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
1aca0 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
1acb0 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74  on a failed writ
1acc0 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  e the lastErrno 
1acd0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
1ace0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1acf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ad00 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69  seekAndWrite(uni
1ad10 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f  xFile *id, i64 o
1ad20 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69  ffset, const voi
1ad30 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
1ad40 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6b  ){.  return seek
1ad50 41 6e 64 57 72 69 74 65 46 64 28 69 64 2d 3e 68  AndWriteFd(id->h
1ad60 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1ad70 63 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72  cnt, &id->lastEr
1ad80 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rno);.}.../*.** 
1ad90 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
1ada0 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
1adb0 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
1adc0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1add0 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
1ade0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
1adf0 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
1ae00 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69  atic int unixWri
1ae10 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
1ae20 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74  le *id, .  const
1ae30 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
1ae40 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
1ae50 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
1ae60 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
1ae70 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1ae80 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f  e*)id;.  int wro
1ae90 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
1aea0 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
1aeb0 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
1aec0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
1aed0 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
1aee0 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
1aef0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
1af00 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
1af10 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
1af20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
1af30 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
1af40 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
1af50 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
1af60 28 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c  ( pFile->pPreall
1af70 6f 63 61 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a  ocatedUnused==0.
1af80 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1af90 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
1afa0 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
1afb0 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
1afc0 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
1afd0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1afe0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20  E_DEBUG.  /* If 
1aff0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
1b000 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
1b010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1b020 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
1b030 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1b040 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1b050 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1b060 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1b070 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
1b080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1b090 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
1b0a0 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
1b0b0 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
1b0c0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
1b0d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1b0e0 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
1b0f0 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
1b100 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
1b110 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
1b120 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
1b130 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
1b140 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
1b150 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1b160 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
1b170 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
1b180 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
1b190 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
1b1a0 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
1b1b0 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
1b1c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b1d0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1b1e0 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
1b1f0 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
1b200 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
1b210 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1b220 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1b230 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
1b240 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
1b250 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
1b260 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
1b270 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1b280 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1b290 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
1b2a0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1b2b0 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
1b2c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b2d0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1b2e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50  ined(SQLITE_MMAP
1b2f0 5f 52 45 41 44 57 52 49 54 45 29 20 26 26 20 53  _READWRITE) && S
1b300 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1b310 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
1b320 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
1b330 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65  this write reque
1b340 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
1b350 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
1b360 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
1b370 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
1b380 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
1b390 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
1b3a0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
1b3b0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
1b3c0 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
1b3d0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1b3e0 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
1b3f0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1b400 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1b410 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20  pBuf, amt);.    
1b420 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b430 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
1b440 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
1b450 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1b460 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
1b470 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1b480 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1b490 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1b4a0 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  uf, nCopy);.    
1b4b0 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
1b4c0 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
1b4d0 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
1b4e0 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
1b4f0 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
1b500 20 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77    }.#endif. .  w
1b510 68 69 6c 65 28 20 28 77 72 6f 74 65 20 3d 20 73  hile( (wrote = s
1b520 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1b530 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  e, offset, pBuf,
1b540 20 61 6d 74 29 29 3c 61 6d 74 20 26 26 20 77 72   amt))<amt && wr
1b550 6f 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74  ote>0 ){.    amt
1b560 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f   -= wrote;.    o
1b570 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a  ffset += wrote;.
1b580 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
1b590 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
1b5a0 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65  ;.  }.  Simulate
1b5b0 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  IOError(( wrote=
1b5c0 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  (-1), amt=1 ));.
1b5d0 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1b5e0 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  llError(( wrote=
1b5f0 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20  0, amt=1 ));..  
1b600 69 66 28 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b  if( amt>wrote ){
1b610 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
1b620 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45   && pFile->lastE
1b630 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a  rrno!=ENOSPC ){.
1b640 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72        /* lastErr
1b650 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
1b660 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1b670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b680 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  ERR_WRITE;.    }
1b690 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72  else{.      stor
1b6a0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1b6b0 2c 20 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73  , 0); /* not a s
1b6c0 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
1b6d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b6e0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
1b6f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1b700 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
1b710 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1b720 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1b730 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
1b740 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
1b750 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
1b760 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
1b770 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
1b780 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
1b790 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
1b7a0 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
1b7b0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1b7c0 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
1b7d0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1b7e0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
1b7f0 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
1b800 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
1b810 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
1b820 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
1b830 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
1b840 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
1b850 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
1b860 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
1b870 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a  lightly slower).
1b880 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79  ** fsync(). If y
1b890 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
1b8a0 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
1b8b0 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
1b8c0 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
1b8d0 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
1b8e0 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
1b8f0 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 20 6f  sync=fdatasync o
1b900 72 20 2d 44 48 41 56 45 5f 46 44 41 54 41 53 59  r -DHAVE_FDATASY
1b910 4e 43 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  NC.*/.#if !defin
1b920 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26  ed(fdatasync) &&
1b930 20 21 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43   !HAVE_FDATASYNC
1b940 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
1b950 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
1b960 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
1b970 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
1b980 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
1b990 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
1b9a0 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
1b9b0 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
1b9c0 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
1b9d0 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
1b9e0 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
1b9f0 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
1ba00 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
1ba10 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
1ba20 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
1ba30 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1ba40 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
1ba50 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1ba60 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
1ba70 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  .../*.** The fsy
1ba80 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
1ba90 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
1baa0 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
1bab0 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
1bac0 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
1bad0 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
1bae0 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
1baf0 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
1bb00 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
1bb10 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1bb20 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
1bb30 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
1bb40 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
1bb50 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
1bb60 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
1bb70 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
1bb80 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
1bb90 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
1bba0 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
1bbb0 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
1bbc0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1bbd0 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
1bbe0 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
1bbf0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1bc00 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
1bc10 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
1bc20 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
1bc30 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
1bc40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1bc50 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74  **.** SQLite set
1bc60 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  s the dataOnly f
1bc70 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20  lag if the size 
1bc80 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  of the file is u
1bc90 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65  nchanged..** The
1bca0 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74   idea behind dat
1bcb0 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74  aOnly is that it
1bcc0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69   should only wri
1bcd0 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  te the file cont
1bce0 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20  ent.** to disk, 
1bcf0 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20  not the inode.  
1bd00 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61  We only set data
1bd10 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65  Only if the file
1bd20 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63   size is .** unc
1bd30 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
1bd40 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61   file size is pa
1bd50 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e  rt of the inode.
1bd60 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54    However, .** T
1bd70 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73  ed Ts'o tells us
1bd80 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
1bd90 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74  ) will also writ
1bda0 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74  e the inode if t
1bdb0 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  he.** file size 
1bdc0 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68  has changed.  Th
1bdd0 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66  e only real diff
1bde0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66  erence between f
1bdf0 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e  datasync().** an
1be00 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74  d fsync(), Ted t
1be10 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74  ells us, is that
1be20 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1be30 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a  l not flush the.
1be40 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20  ** inode if the 
1be50 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f  mtime or owner o
1be60 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74  r other inode at
1be70 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68  tributes have ch
1be80 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c  anged..** We onl
1be90 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  y care about the
1bea0 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20   file size, not 
1beb0 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61  the other file a
1bec0 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a  ttributes, so.**
1bed0 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74   as far as SQLit
1bee0 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20  e is concerned, 
1bef0 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  an fdatasync() i
1bf00 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74  s always adequat
1bf10 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77  e..** So, we alw
1bf20 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e  ays use fdatasyn
1bf30 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61  c() if it is ava
1bf40 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65  ilable, regardle
1bf50 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c  ss of.** the val
1bf60 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e  ue of the dataOn
1bf70 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74  ly flag..*/.stat
1bf80 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
1bf90 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
1bfa0 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
1bfb0 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
1bfc0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1bfd0 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
1bfe0 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
1bff0 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
1c000 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
1c010 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
1c020 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
1c030 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
1c040 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
1c050 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
1c060 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
1c070 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
1c080 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
1c090 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1c0a0 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
1c0b0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
1c0c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1c0d0 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1c0e0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1c0f0 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
1c100 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
1c110 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1c120 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a  ataOnly);.#else.
1c130 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c140 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
1c150 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1c160 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
1c170 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
1c180 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
1c190 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
1c1a0 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
1c1b0 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
1c1c0 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
1c1d0 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
1c1e0 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1c1f0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
1c200 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
1c210 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
1c220 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
1c230 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1c240 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
1c250 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
1c260 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
1c270 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
1c280 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
1c290 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
1c2a0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
1c2b0 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
1c2c0 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
1c2d0 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20 20   a.  ** no-op.  
1c2e0 42 75 74 20 67 6f 20 61 68 65 61 64 20 61 6e 64  But go ahead and
1c2f0 20 63 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f   call fstat() to
1c300 20 76 61 6c 69 64 61 74 65 20 74 68 65 20 66 69   validate the fi
1c310 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
1c320 6f 72 20 61 73 20 77 65 20 6e 65 65 64 20 61 20  or as we need a 
1c330 6d 65 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f 6b  method to provok
1c340 65 20 61 20 66 61 69 6c 75 72 65 20 64 75 72 69  e a failure duri
1c350 6e 67 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74 65  ng.  ** coverate
1c360 20 74 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a 23   testing..  */.#
1c370 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1c380 53 59 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74 72  SYNC.  {.    str
1c390 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
1c3a0 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
1c3b0 64 2c 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23 65  d, &buf);.  }.#e
1c3c0 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1c3d0 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  NC.  if( fullSyn
1c3e0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c ){.    rc = os
1c3f0 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  Fcntl(fd, F_FULL
1c400 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
1c410 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
1c420 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
1c430 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
1c440 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
1c450 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
1c460 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
1c470 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
1c480 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
1c490 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
1c4a0 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
1c4b0 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
1c4c0 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
1c4d0 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
1c4e0 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
1c4f0 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
1c500 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
1c510 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
1c520 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
1c530 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
1c540 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
1c550 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
1c560 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
1c570 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
1c580 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
1c590 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
1c5a0 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
1c5b0 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
1c5c0 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
1c5d0 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
1c5e0 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
1c5f0 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
1c600 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
1c610 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
1c620 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
1c630 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
1c640 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
1c650 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
1c660 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
1c670 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
1c680 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
1c690 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
1c6a0 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
1c6b0 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
1c6c0 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
1c6d0 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
1c6e0 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
1c6f0 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
1c700 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
1c710 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
1c720 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
1c730 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
1c740 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
1c750 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
1c760 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
1c770 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
1c780 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
1c790 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
1c7a0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
1c7b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c7c0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
1c7d0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
1c7e0 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1c7f0 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69  taining file zFi
1c800 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75  lename..** If su
1c810 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69  ccessful, *pFd i
1c820 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65  s set to the ope
1c830 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ned file descrip
1c840 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  tor and.** SQLIT
1c850 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c860 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1c870 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c  curs, either SQL
1c880 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20  ITE_NOMEM.** or 
1c890 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1c8a0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1c8b0 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61  *pFd is set to a
1c8c0 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76  n undefined.** v
1c8d0 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alue..**.** The 
1c8e0 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
1c8f0 65 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65  escriptor is use
1c900 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74  d for only one t
1c910 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79  hing - to.** fsy
1c920 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79  nc() a directory
1c930 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69   to make sure fi
1c940 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  le creation and 
1c950 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a  deletion events.
1c960 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ** are flushed t
1c970 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73  o disk.  Such fs
1c980 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65  yncs are not nee
1c990 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20  ded on newer.** 
1c9a0 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73  journaling files
1c9b0 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20  ystems, but are 
1c9c0 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65  required on olde
1c9d0 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a  r filesystems..*
1c9e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c9f0 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  e can be overrid
1ca00 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53  den using the xS
1ca10 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66  etSysCall interf
1ca20 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c  ace..** The abil
1ca30 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20  ity to override 
1ca40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1ca50 20 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72   added in suppor
1ca60 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f  t of the.** chro
1ca70 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f  mium sandbox.  O
1ca80 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f  pening a directo
1ca90 72 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79  ry is a security
1caa0 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a   risk (we are.**
1cab0 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67   told) so making
1cac0 20 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65   it overrideable
1cad0 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f   allows the chro
1cae0 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a  mium sandbox to.
1caf0 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20  ** replace this 
1cb00 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68  routine with a h
1cb10 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20  armless no-op.  
1cb20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75  To make this rou
1cb30 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c  tine.** a no-op,
1cb40 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68   replace it with
1cb50 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74   a stub that ret
1cb60 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62  urns SQLITE_OK b
1cb70 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46  ut leaves.** *pF
1cb80 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74  d set to a negat
1cb90 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  ive number..**.*
1cba0 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1cbb0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1cbc0 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1cbd0 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e  sible for closin
1cbe0 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  g.** the file de
1cbf0 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73  scriptor *pFd us
1cc00 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a  ing close()..*/.
1cc10 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
1cc20 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
1cc30 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1cc40 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74  int *pFd){.  int
1cc50 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   ii;.  int fd = 
1cc60 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e  -1;.  char zDirn
1cc70 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
1cc80 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  +1];..  sqlite3_
1cc90 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1cca0 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c  HNAME, zDirname,
1ccb0 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65   "%s", zFilename
1ccc0 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74  );.  for(ii=(int
1ccd0 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  )strlen(zDirname
1cce0 29 3b 20 69 69 3e 30 20 26 26 20 7a 44 69 72 6e  ); ii>0 && zDirn
1ccf0 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69  ame[ii]!='/'; ii
1cd00 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20  --);.  if( ii>0 
1cd10 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ){.    zDirname[
1cd20 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65  ii] = '\0';.  }e
1cd30 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 7a 44 69  lse{.    if( zDi
1cd40 72 6e 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20  rname[0]!='/' ) 
1cd50 7a 44 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e  zDirname[0] = '.
1cd60 27 3b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ';.    zDirname[
1cd70 31 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64  1] = 0;.  }.  fd
1cd80 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
1cd90 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
1cda0 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
1cdb0 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
1cdc0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
1cdd0 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
1cde0 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b   fd, zDirname));
1cdf0 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64  .  }.  *pFd = fd
1ce00 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20  ;.  if( fd>=0 ) 
1ce10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ce20 3b 0a 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c  ;.  return unixL
1ce30 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1ce40 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
1ce50 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a  penDirectory", z
1ce60 44 69 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  Dirname);.}../*.
1ce70 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
1ce80 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
1ce90 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
1cea0 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
1ceb0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
1cec0 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
1ced0 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
1cee0 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
1cef0 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
1cf00 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
1cf10 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
1cf20 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
1cf30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
1cf40 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
1cf50 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
1cf60 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
1cf70 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1cf80 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1cf90 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
1cfa0 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
1cfb0 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
1cfc0 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
1cfd0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
1cfe0 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
1cff0 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
1d000 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
1d010 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
1d020 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
1d030 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
1d040 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
1d050 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
1d060 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
1d070 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
1d080 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
1d090 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
1d0a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
1d0b0 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
1d0c0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
1d0d0 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1d0e0 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
1d0f0 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
1d100 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
1d110 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
1d120 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
1d130 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
1d140 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
1d150 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
1d160 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
1d170 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
1d180 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
1d190 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1d1a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
1d1b0 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20   int isDataOnly 
1d1c0 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  = (flags&SQLITE_
1d1d0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a  SYNC_DATAONLY);.
1d1e0 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63    int isFullsync
1d1f0 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d   = (flags&0x0F)=
1d200 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1d210 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  L;..  /* Check t
1d220 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
1d230 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
1d240 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
1d250 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
1d260 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1d270 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
1d280 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
1d290 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1d2a0 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
1d2b0 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
1d2c0 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
1d2d0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1d2e0 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
1d2f0 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
1d300 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
1d310 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
1d320 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
1d330 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
1d340 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
1d350 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1d360 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73  E_FULL );..  ass
1d370 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1d380 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20  OSTRACE(("SYNC  
1d390 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
1d3a0 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75  ->h));.  rc = fu
1d3b0 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
1d3c0 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69  h, isFullsync, i
1d3d0 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69  sDataOnly);.  Si
1d3e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1d3f0 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20  c=1 );.  if( rc 
1d400 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
1d410 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
1d420 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  no);.    return 
1d430 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1d440 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
1d450 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70   "full_fsync", p
1d460 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1d470 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79  }..  /* Also fsy
1d480 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  nc the directory
1d490 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1d4a0 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53  file if the DIRS
1d4b0 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  YNC flag.  ** is
1d4c0 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 61   set.  This is a
1d4d0 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72   one-time occurr
1d4e0 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74  ence.  Many syst
1d4f0 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41  ems (examples: A
1d500 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61  IX).  ** are una
1d510 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64  ble to fsync a d
1d520 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e  irectory, so ign
1d530 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68  ore errors on th
1d540 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  e fsync..  */.  
1d550 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
1d560 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
1d570 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69  DIRSYNC ){.    i
1d580 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53  nt dirfd;.    OS
1d590 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20  TRACE(("DIRSYNC 
1d5a0 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79  %s (have_fullfsy
1d5b0 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25  nc=%d fullsync=%
1d5c0 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  d)\n", pFile->zP
1d5d0 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ath,.           
1d5e0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c   HAVE_FULLFSYNC,
1d5f0 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20   isFullsync));. 
1d600 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69     rc = osOpenDi
1d610 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a  rectory(pFile->z
1d620 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20  Path, &dirfd);. 
1d630 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75  E_OK ){.      fu
1d650 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20  ll_fsync(dirfd, 
1d660 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62  0, 0);.      rob
1d670 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
1d680 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
1d690 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d6a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1d6b0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1d6c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1d6d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1d6e0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1d6f0 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45  ags &= ~UNIXFILE
1d700 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20  _DIRSYNC;.  }.  
1d710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d720 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
1d730 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
1d740 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
1d750 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1d760 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
1d770 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e  _file *id, i64 n
1d780 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c  Byte){.  unixFil
1d790 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1d7a0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1d7b0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
1d7c0 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
1d7d0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1d7e0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
1d7f0 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a  RUNCATE );..  /*
1d800 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
1d810 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
1d820 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
1d830 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
1d840 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
1d850 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
1d860 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
1d870 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
1d880 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
1d890 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
1d8a0 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
1d8b0 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
1d8c0 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
1d8d0 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
1d8e0 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
1d8f0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
1d900 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
1d910 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
1d920 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
1d930 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
1d940 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1d950 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74  }..  rc = robust
1d960 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1d970 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  ->h, nByte);.  i
1d980 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f  f( rc ){.    sto
1d990 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1d9a0 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  e, errno);.    r
1d9b0 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1d9c0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1d9d0 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1d9e0 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1d9f0 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  ath);.  }else{.#
1da00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1da10 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  UG.    /* If we 
1da20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
1da30 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
1da40 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
1da50 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a  opposed to.    *
1da60 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1da70 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1da80 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1da90 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1daa0 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61  n a.    ** norma
1dab0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1dac0 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65   and we truncate
1dad0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1dae0 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a  o length,.    **
1daf0 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c   that effectivel
1db00 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1db10 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54  ange counter.  T
1db20 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1db30 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73  .    ** when res
1db40 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73  toring a databas
1db50 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b  e using the back
1db60 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65  up API from a ze
1db70 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  ro-length.    **
1db80 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a   source..    */.
1db90 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69      if( pFile->i
1dba0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20  nNormalWrite && 
1dbb0 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
1dbc0 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1dbd0 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20  trChng = 1;.    
1dbe0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
1dbf0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1dc00 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74  ZE>0.    /* If t
1dc10 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  he file was just
1dc20 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20   truncated to a 
1dc30 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  size smaller tha
1dc40 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a  n the currently.
1dc50 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65      ** mapped re
1dc60 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
1dc70 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
1dc80 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
1dc90 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20   SQLite will.   
1dca0 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61   ** use read() a
1dcb0 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63  nd write() to ac
1dcc0 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64  cess data beyond
1dcd0 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d   this point from
1dce0 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a   now on.  .    *
1dcf0 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c  /.    if( nByte<
1dd00 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1dd10 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1dd20 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65  mmapSize = nByte
1dd30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1dd40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1dd50 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
1dd60 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
1dd70 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1dd80 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
1dd90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1dda0 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nixFileSize(sqli
1ddb0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1ddc0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
1ddd0 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74   rc;.  struct st
1dde0 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
1ddf0 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f  ( id );.  rc = o
1de00 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c  sFstat(((unixFil
1de10 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
1de20 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1de30 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1de40 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1de50 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
1de60 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72  unixFile*)id, er
1de70 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
1de80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1de90 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
1dea0 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
1deb0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
1dec0 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
1ded0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
1dee0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72  ndInodeInfo() pr
1def0 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
1df00 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
1df10 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
1df20 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
1df30 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
1df40 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
1df50 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
1df60 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
1df70 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
1df80 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
1df90 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
1dfa0 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
1dfb0 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
1dfc0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
1dfd0 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
1dfe0 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
1dff0 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
1e000 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
1e010 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
1e020 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1e030 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1e040 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1e050 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1e060 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
1e070 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
1e080 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
1e090 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
1e0a0 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
1e0b0 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
1e0c0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
1e0d0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
1e0e0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1e0f0 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1e100 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  );.#endif../* .*
1e110 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e120 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
1e130 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46  dle the SQLITE_F
1e140 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a  CNTL_SIZE_HINT .
1e150 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ** file-control 
1e160 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61  operation.  Enla
1e170 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rge the database
1e180 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69   to nBytes in si
1e190 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75  ze.** (rounded u
1e1a0 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  p to the next ch
1e1b0 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74  unk-size).  If t
1e1c0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
1e1d0 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73  lready.** nBytes
1e1e0 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73   or larger, this
1e1f0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1e200 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
1e210 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74  nt fcntlSizeHint
1e220 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1e230 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
1e240 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1e250 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20  nk>0 ){.    i64 
1e260 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
1e270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
1e280 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1e290 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
1e2a0 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  at buf;         
1e2b0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1e2c0 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75  hold return valu
1e2d0 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f  es of fstat() */
1e2e0 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46  .   .    if( osF
1e2f0 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
1e300 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65  buf) ){.      re
1e310 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1e320 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a  R_FSTAT;.    }..
1e330 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42      nSize = ((nB
1e340 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75  yte+pFile->szChu
1e350 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73  nk-1) / pFile->s
1e360 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
1e370 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66  >szChunk;.    if
1e380 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66  ( nSize>(i64)buf
1e390 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66  .st_size ){..#if
1e3a0 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
1e3b0 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
1e3c0 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
1e3d0 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20  LOCATE.      /* 
1e3e0 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69  The code below i
1e3f0 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72  s handling the r
1e400 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f  eturn value of o
1e410 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20  sFallocate() .  
1e420 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79      ** correctly
1e430 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  . posix_fallocat
1e440 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  e() is defined t
1e450 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  o "returns zero 
1e460 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20  on success, .   
1e470 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f     ** or an erro
1e480 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69  r number on  fai
1e490 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d  lure". See the m
1e4a0 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61 69  anpage for detai
1e4b0 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ls. */.      int
1e4c0 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a   err;.      do{.
1e4d0 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73          err = os
1e4e0 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d  Fallocate(pFile-
1e4f0 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c  >h, buf.st_size,
1e500 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69   nSize-buf.st_si
1e510 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  ze);.      }whil
1e520 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b  e( err==EINTR );
1e530 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29  .      if( err )
1e540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e550 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73  OERR_WRITE;.#els
1e560 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  e.      /* If th
1e570 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61  e OS does not ha
1e580 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  ve posix_falloca
1e590 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57  te(), fake it. W
1e5a0 72 69 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a  rite a .      **
1e5b0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20   single byte to 
1e5c0 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e  the last byte in
1e5d0 20 65 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74   each block that
1e5e0 20 66 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a   falls entirely.
1e5f0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20        ** within 
1e600 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 67  the extended reg
1e610 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65  ion. Then, if re
1e620 71 75 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65  quired, a single
1e630 20 62 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61   byte.      ** a
1e640 74 20 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d  t offset (nSize-
1e650 31 29 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73  1), to set the s
1e660 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1e670 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20  correctly..     
1e680 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 69   ** This is a si
1e690 6d 69 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20  milar technique 
1e6a0 74 6f 20 74 68 61 74 20 75 73 65 64 20 62 79 20  to that used by 
1e6b0 67 6c 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73  glibc on systems
1e6c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64  .      ** that d
1e6d0 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61  o not have a rea
1e6e0 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61  l fallocate() ca
1e6f0 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
1e700 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75     int nBlk = bu
1e710 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f  f.st_blksize;  /
1e720 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c  * File-system bl
1e730 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ock size */.    
1e740 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
1e750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e760 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1e770 20 77 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b   written by seek
1e780 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  AndWrite */.    
1e790 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20    i64 iWrite;   
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e7b0 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20   Next offset to 
1e7c0 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20  write to */..   
1e7d0 20 20 20 69 57 72 69 74 65 20 3d 20 28 62 75 66     iWrite = (buf
1e7e0 2e 73 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a 6e  .st_size/nBlk)*n
1e7f0 42 6c 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b 0a  Blk + nBlk - 1;.
1e800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 57        assert( iW
1e810 72 69 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a  rite>=buf.st_siz
1e820 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
1e830 74 28 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e  t( ((iWrite+1)%n
1e840 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Blk)==0 );.     
1e850 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20   for(/*no-op*/; 
1e860 69 57 72 69 74 65 3c 6e 53 69 7a 65 2b 6e 42 6c  iWrite<nSize+nBl
1e870 6b 2d 31 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c  k-1; iWrite+=nBl
1e880 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  k ){.        if(
1e890 20 69 57 72 69 74 65 3e 3d 6e 53 69 7a 65 20 29   iWrite>=nSize )
1e8a0 20 69 57 72 69 74 65 20 3d 20 6e 53 69 7a 65 20   iWrite = nSize 
1e8b0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 57 72  - 1;.        nWr
1e8c0 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
1e8d0 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65  te(pFile, iWrite
1e8e0 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20  , "", 1);.      
1e8f0 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20    if( nWrite!=1 
1e900 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1e910 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
1e920 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1e930 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  }.  }..#if SQLIT
1e940 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1e950 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d  0.  if( pFile->m
1e960 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20  mapSizeMax>0 && 
1e970 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61  nByte>pFile->mma
1e980 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74  pSize ){.    int
1e990 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69   rc;.    if( pFi
1e9a0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29  le->szChunk<=0 )
1e9b0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75  {.      if( robu
1e9c0 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69  st_ftruncate(pFi
1e9d0 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b  le->h, nByte) ){
1e9e0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
1e9f0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
1ea00 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  rrno);.        r
1ea10 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1ea20 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1ea30 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1ea40 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1ea50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
1ea60 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e    }..    rc = un
1ea70 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c  ixMapfile(pFile,
1ea80 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74   nByte);.    ret
1ea90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
1eaa0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  if..  return SQL
1eab0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1eac0 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69   If *pArg is ini
1ead0 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20  tially negative 
1eae0 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71  then this is a q
1eaf0 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67  uery.  Set *pArg
1eb00 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65   to.** 1 or 0 de
1eb10 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1eb20 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61  er or not bit ma
1eb30 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  sk of pFile->ctr
1eb40 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a  lFlags is set..*
1eb50 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1eb60 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c   0 or 1, then cl
1eb70 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d  ear or set the m
1eb80 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65  ask bit of pFile
1eb90 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a  ->ctrlFlags..*/.
1eba0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
1ebb0 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65  ModeBit(unixFile
1ebc0 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65   *pFile, unsigne
1ebd0 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74  d char mask, int
1ebe0 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a   *pArg){.  if( *
1ebf0 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70  pArg<0 ){.    *p
1ec00 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74  Arg = (pFile->ct
1ec10 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21  rlFlags & mask)!
1ec20 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  =0;.  }else if( 
1ec30 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20  (*pArg)==0 ){.  
1ec40 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1ec50 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d  gs &= ~mask;.  }
1ec60 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1ec70 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61  >ctrlFlags |= ma
1ec80 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f  sk;.  }.}../* Fo
1ec90 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1eca0 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
1ecb0 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
1ecc0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1ecd0 7a 42 75 66 29 3b 0a 73 74 61 74 69 63 20 69 6e  zBuf);.static in
1ece0 74 20 66 63 6e 74 6c 52 65 61 64 53 68 6d 28 75  t fcntlReadShm(u
1ecf0 6e 69 78 46 69 6c 65 2a 2c 76 6f 69 64 2a 29 3b  nixFile*,void*);
1ed00 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  ../*.** Informat
1ed10 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ion and control 
1ed20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  of an open file 
1ed30 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
1ed40 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f  c int unixFileCo
1ed50 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1ed60 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
1ed70 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75  void *pArg){.  u
1ed80 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1ed90 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1eda0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1edb0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69  #if defined(__li
1edc0 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65  nux__) && define
1edd0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1ede0 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49  BATCH_ATOMIC_WRI
1edf0 54 45 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  TE).    case SQL
1ee00 49 54 45 5f 46 43 4e 54 4c 5f 42 45 47 49 4e 5f  ITE_FCNTL_BEGIN_
1ee10 41 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a  ATOMIC_WRITE: {.
1ee20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f        int rc = o
1ee30 73 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sIoctl(pFile->h,
1ee40 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f   F2FS_IOC_START_
1ee50 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20  ATOMIC_WRITE);. 
1ee60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
1ee70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 45   SQLITE_IOERR_BE
1ee80 47 49 4e 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c  GIN_ATOMIC : SQL
1ee90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1eea0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1eeb0 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49  NTL_COMMIT_ATOMI
1eec0 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  C_WRITE: {.     
1eed0 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74   int rc = osIoct
1eee0 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53  l(pFile->h, F2FS
1eef0 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d  _IOC_COMMIT_ATOM
1ef00 49 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20  IC_WRITE);.     
1ef10 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
1ef20 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4d 4d 49 54  ITE_IOERR_COMMIT
1ef30 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45  _ATOMIC : SQLITE
1ef40 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1ef50 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1ef60 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43  _ROLLBACK_ATOMIC
1ef70 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  _WRITE: {.      
1ef80 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c  int rc = osIoctl
1ef90 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f  (pFile->h, F2FS_
1efa0 49 4f 43 5f 41 42 4f 52 54 5f 56 4f 4c 41 54 49  IOC_ABORT_VOLATI
1efb0 4c 45 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20  LE_WRITE);.     
1efc0 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
1efd0 49 54 45 5f 49 4f 45 52 52 5f 52 4f 4c 4c 42 41  ITE_IOERR_ROLLBA
1efe0 43 4b 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49  CK_ATOMIC : SQLI
1eff0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
1f000 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f  dif /* __linux__
1f010 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1f020 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57  E_BATCH_ATOMIC_W
1f030 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20 63 61 73  RITE */..    cas
1f040 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52  e SQLITE_FCNTL_R
1f050 45 41 44 5f 53 48 4d 3a 20 7b 0a 20 20 20 20 20  EAD_SHM: {.     
1f060 20 72 65 74 75 72 6e 20 66 63 6e 74 6c 52 65 61   return fcntlRea
1f070 64 53 68 6d 28 70 46 69 6c 65 2c 20 70 41 72 67  dShm(pFile, pArg
1f080 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  );.    }..    ca
1f090 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1f0a0 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
1f0b0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1f0c0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1f0d0 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  k;.      return 
1f0e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1f0f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f100 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e  _FCNTL_LAST_ERRN
1f110 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
1f120 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1f130 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
1f140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f150 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1f160 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
1f170 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
1f180 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
1f190 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
1f1a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1f1b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1f1c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f1d0 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
1f1e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b   {.      int rc;
1f1f0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1f200 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1f210 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74  .      rc = fcnt
1f220 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c  lSizeHint(pFile,
1f230 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a   *(i64 *)pArg);.
1f240 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1f250 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1f260 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f270 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f280 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
1f290 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20  SIST_WAL: {.    
1f2a0 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46    unixModeBit(pF
1f2b0 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45  ile, UNIXFILE_PE
1f2c0 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
1f2d0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
1f2e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f2f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1f300 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
1f310 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
1f320 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64   {.      unixMod
1f330 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58  eBit(pFile, UNIX
1f340 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
1f350 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
1f360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f370 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1f380 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
1f390 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63  AME: {.      *(c
1f3a0 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  har**)pArg = sql
1f3b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1f3c0 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  ", pFile->pVfs->
1f3d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
1f3e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f3f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1f400 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
1f410 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  FILENAME: {.    
1f420 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d    char *zTFile =
1f430 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1f440 34 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  4( pFile->pVfs->
1f450 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
1f460 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29      if( zTFile )
1f470 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65  {.        unixGe
1f480 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d  tTempname(pFile-
1f490 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1f4a0 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  e, zTFile);.    
1f4b0 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
1f4c0 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20  g = zTFile;.    
1f4d0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1f4e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f4f0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1f500 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45  E_FCNTL_HAS_MOVE
1f510 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  D: {.      *(int
1f520 2a 29 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73  *)pArg = fileHas
1f530 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20  Moved(pFile);.  
1f540 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f550 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20  E_OK;.    }.#if 
1f560 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1f570 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20  SIZE>0.    case 
1f580 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
1f590 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
1f5a0 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a  i64 newLimit = *
1f5b0 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  (i64*)pArg;.    
1f5c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f5d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
1f5e0 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33  newLimit>sqlite3
1f5f0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
1f600 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  map ){.        n
1f610 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  ewLimit = sqlite
1f620 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
1f630 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Mmap;.      }.. 
1f640 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
1f650 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74 20 6d 61  e of newLimit ma
1f660 79 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  y be eventually 
1f670 63 61 73 74 20 74 6f 20 28 73 69 7a 65 5f 74 29  cast to (size_t)
1f680 20 61 6e 64 20 70 61 73 73 65 64 0a 20 20 20 20   and passed.    
1f690 20 20 2a 2a 20 74 6f 20 6d 6d 61 70 28 29 2e 20    ** to mmap(). 
1f6a0 52 65 73 74 72 69 63 74 20 69 74 73 20 76 61 6c  Restrict its val
1f6b0 75 65 20 74 6f 20 32 47 42 20 69 66 20 28 73 69  ue to 2GB if (si
1f6c0 7a 65 5f 74 29 20 69 73 20 6e 6f 74 20 61 74 20  ze_t) is not at 
1f6d0 6c 65 61 73 74 20 61 0a 20 20 20 20 20 20 2a 2a  least a.      **
1f6e0 20 36 34 2d 62 69 74 20 74 79 70 65 2e 20 2a 2f   64-bit type. */
1f6f0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
1f700 6d 69 74 3e 30 20 26 26 20 73 69 7a 65 6f 66 28  mit>0 && sizeof(
1f710 73 69 7a 65 5f 74 29 3c 38 20 29 7b 0a 20 20 20  size_t)<8 ){.   
1f720 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
1f730 28 6e 65 77 4c 69 6d 69 74 20 26 20 30 78 37 46  (newLimit & 0x7F
1f740 46 46 46 46 46 46 29 3b 0a 20 20 20 20 20 20 7d  FFFFFF);.      }
1f750 0a 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  ..      *(i64*)p
1f760 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
1f770 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
1f780 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
1f790 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
1f7a0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
1f7b0 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
1f7c0 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
1f7d0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1f7e0 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
1f7f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
1f800 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
1f810 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  {.          unix
1f820 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
1f830 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1f840 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
1f850 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  le, -1);.       
1f860 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1f870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f880 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1f890 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1f8a0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
1f8b0 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
1f8c0 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
1f8d0 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
1f8e0 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
1f8f0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1f900 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
1f910 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
1f920 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
1f930 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
1f940 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
1f950 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
1f960 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
1f970 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1f980 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
1f990 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
1f9a0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1f9b0 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
1f9c0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1f9d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f9e0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
1f9f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1fa00 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1fa10 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1fa20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1fa30 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
1fa40 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
1fa50 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45   SQLITE_FCNTL_GE
1fa60 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1fa70 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1fa80 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1fa90 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
1faa0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1fab0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1fac0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1fad0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1fae0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1faf0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1fb00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 64  .}../*.** If pFd
1fb10 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  ->sectorSize is 
1fb20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74 68  non-zero when th
1fb30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1fb40 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 0a 2a  alled, it is a.*
1fb50 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  * no-op. Otherwi
1fb60 73 65 2c 20 74 68 65 20 76 61 6c 75 65 73 20 6f  se, the values o
1fb70 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a  f pFd->sectorSiz
1fb80 65 20 61 6e 64 20 0a 2a 2a 20 70 46 64 2d 3e 64  e and .** pFd->d
1fb90 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1fba0 74 69 63 73 20 61 72 65 20 73 65 74 20 61 63 63  tics are set acc
1fbb0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 69  ording to the fi
1fbc0 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 63 68  le-system .** ch
1fbd0 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 20 0a  aracteristics. .
1fbe0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
1fbf0 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
1fc00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f  this function. O
1fc10 6e 65 20 66 6f 72 20 51 4e 58 20 61 6e 64 20 6f  ne for QNX and o
1fc20 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6f 74  ne for all.** ot
1fc30 68 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  her systems..*/.
1fc40 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  #ifndef __QNXNTO
1fc50 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  __.static void s
1fc60 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65  etDeviceCharacte
1fc70 72 69 73 74 69 63 73 28 75 6e 69 78 46 69 6c 65  ristics(unixFile
1fc80 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74   *pFd){.  assert
1fc90 28 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61  ( pFd->deviceCha
1fca0 72 61 63 74 65 72 69 73 74 69 63 73 3d 3d 30 20  racteristics==0 
1fcb0 7c 7c 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69  || pFd->sectorSi
1fcc0 7a 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ze!=0 );.  if( p
1fcd0 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d  Fd->sectorSize==
1fce0 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  0 ){.#if defined
1fcf0 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64  (__linux__) && d
1fd00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1fd10 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
1fd20 43 5f 57 52 49 54 45 29 0a 20 20 20 20 69 6e 74  C_WRITE).    int
1fd30 20 72 65 73 3b 0a 20 20 20 20 75 33 32 20 66 20   res;.    u32 f 
1fd40 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  = 0;..    /* Che
1fd50 63 6b 20 66 6f 72 20 73 75 70 70 6f 72 74 20 66  ck for support f
1fd60 6f 72 20 46 32 46 53 20 61 74 6f 6d 69 63 20 62  or F2FS atomic b
1fd70 61 74 63 68 20 77 72 69 74 65 73 2e 20 2a 2f 0a  atch writes. */.
1fd80 20 20 20 20 72 65 73 20 3d 20 6f 73 49 6f 63 74      res = osIoct
1fd90 6c 28 70 46 64 2d 3e 68 2c 20 46 32 46 53 5f 49  l(pFd->h, F2FS_I
1fda0 4f 43 5f 47 45 54 5f 46 45 41 54 55 52 45 53 2c  OC_GET_FEATURES,
1fdb0 20 26 66 29 3b 0a 20 20 20 20 69 66 28 20 72 65   &f);.    if( re
1fdc0 73 3d 3d 30 20 26 26 20 28 66 20 26 20 46 32 46  s==0 && (f & F2F
1fdd0 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d 49 43  S_FEATURE_ATOMIC
1fde0 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
1fdf0 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72   pFd->deviceChar
1fe00 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 53 51  acteristics = SQ
1fe10 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48  LITE_IOCAP_BATCH
1fe20 5f 41 54 4f 4d 49 43 3b 0a 20 20 20 20 7d 0a 23  _ATOMIC;.    }.#
1fe30 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78  endif /* __linux
1fe40 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  __ && SQLITE_ENA
1fe50 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
1fe60 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20 2f  _WRITE */..    /
1fe70 2a 20 53 65 74 20 74 68 65 20 50 4f 57 45 52 53  * Set the POWERS
1fe80 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 66 6c  AFE_OVERWRITE fl
1fe90 61 67 20 69 66 20 72 65 71 75 65 73 74 65 64 2e  ag if requested.
1fea0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 64 2d   */.    if( pFd-
1feb0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
1fec0 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20  XFILE_PSOW ){.  
1fed0 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43      pFd->deviceC
1fee0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 7c  haracteristics |
1fef0 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  = SQLITE_IOCAP_P
1ff00 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1ff10 54 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  TE;.    }..    p
1ff20 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  Fd->sectorSize =
1ff30 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1ff40 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
1ff50 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64  .}.#else.#includ
1ff60 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e  e <sys/dcmd_blk.
1ff70 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
1ff80 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61 74  /statvfs.h>.stat
1ff90 69 63 20 76 6f 69 64 20 73 65 74 44 65 76 69 63  ic void setDevic
1ffa0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1ffb0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1ffc0 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ){.  if( pFile->
1ffd0 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20  sectorSize == 0 
1ffe0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
1fff0 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  atvfs fsInfo;.  
20000 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74       .    /* Set
20010 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f   defaults for no
20020 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65  n-supported file
20030 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70  systems */.    p
20040 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
20050 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
20060 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
20070 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
20080 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
20090 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74  = 0;.    if( fst
200a0 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20  atvfs(pFile->h, 
200b0 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
200c0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
200d0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
200e0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
200f0 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
20100 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d  .f_basetype, "tm
20110 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  p") ) {.      pF
20120 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
20130 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
20140 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
20150 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20160 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
20170 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
20180 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20  IC4K |       /* 
20190 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74  All ram filesyst
201a0 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74  em writes are at
201b0 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
201c0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
201d0 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
201e0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
201f0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
20200 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
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 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
20240 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
20250 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
20260 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
20270 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
20280 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
20290 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
202c0 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
202d0 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
202e0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73    }else if( strs
202f0 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  tr(fsInfo.f_base
20300 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b  type, "etfs") ){
20310 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
20320 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
20330 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
20340 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
20350 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
20360 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20          /* etfs 
20370 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69  cluster size wri
20380 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
20390 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65  /.        (pFile
203a0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
203b0 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
203c0 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20  P_ATOMIC512) |. 
203d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
203e0 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
203f0 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
20400 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
20410 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
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 74 68 65 20 77 72 69 74 65      ** the write
20450 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
20460 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
20470 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
20480 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
20490 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
204a0 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
204b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
204e0 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
204f0 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
20500 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
20510 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71  o.f_basetype, "q
20520 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70  nx6") ){.      p
20530 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
20540 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
20550 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
20560 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20570 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
20580 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
20590 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a  MIC |         /*
205a0 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20   All filesystem 
205b0 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
205c0 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  c */.        SQL
205d0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
205e0 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
205f0 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
20600 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
20610 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
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 74 68 65            ** the
20640 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
20650 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
20660 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
20670 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
20680 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
20690 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
206a0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
206b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206c0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
206d0 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
206e0 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
206f0 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70  else if( !strcmp
20700 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
20710 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20  pe, "qnx4") ){. 
20720 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
20730 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
20740 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
20750 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
20760 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
20770 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69        /* full bi
20780 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20  tset of atomics 
20790 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20  from max sector 
207a0 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72  size and smaller
207b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46   */.        ((pF
207c0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
207d0 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
207e0 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
207f0 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20  << 1) - 2 |.    
20800 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
20810 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
20820 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
20830 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
20840 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
20850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
20880 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
20890 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
208a0 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e  ( strstr(fsInfo.
208b0 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73  f_basetype, "dos
208c0 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
208d0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
208e0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
208f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
20900 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
20910 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
20920 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61  full bitset of a
20930 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20  tomics from max 
20940 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20  sector size and 
20950 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20  smaller */.     
20960 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74     ((pFile->sect
20970 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53  orSize / 512 * S
20980 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
20990 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32  IC512) << 1) - 2
209a0 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   |.        SQLIT
209b0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
209c0 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
209d0 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
209e0 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
209f0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a10 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
20a20 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
20a30 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
20a40 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
20a50 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
20a60 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
20a70 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
20a80 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20  ATOMIC512 |     
20a90 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61   /* blocks are a
20aa0 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
20ab0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
20ac0 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
20ad0 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
20ae0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
20af0 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20b20 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
20b30 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  eds */.        0
20b40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
20b50 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72   Last chance ver
20b60 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74  ification.  If t
20b70 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
20b80 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20  sn't a multiple 
20b90 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e  of 512.  ** then
20ba0 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e   it isn't valid.
20bb0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
20bc0 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32  sectorSize % 512
20bd0 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69   != 0 ){.    pFi
20be0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
20bf0 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  teristics = 0;. 
20c00 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
20c10 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Size = SQLITE_DE
20c20 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
20c30 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  E;.  }.}.#endif.
20c40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
20c50 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
20c60 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
20c70 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
20c80 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
20c90 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
20ca0 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
20cb0 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
20cc0 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
20cd0 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
20ce0 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
20cf0 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
20d00 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
20d10 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
20d20 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
20d30 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
20d40 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
20d50 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
20d60 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
20d70 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
20d80 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75  base and its jou
20d90 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
20da0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
20db0 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
20dc0 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
20dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
20de0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
20df0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
20e00 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20  unixFile *pFd = 
20e10 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
20e20 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63   setDeviceCharac
20e30 74 65 72 69 73 74 69 63 73 28 70 46 64 29 3b 0a  teristics(pFd);.
20e40 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e 73 65    return pFd->se
20e50 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  ctorSize;.}../*.
20e60 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
20e70 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
20e80 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
20e90 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46  e..**.** This VF
20ea0 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72  S is set up to r
20eb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
20ec0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
20ed0 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c  RWRITE by defaul
20ee0 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  t..** However, t
20ef0 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f  hat choice is co
20f00 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63  ntroversial sinc
20f10 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  e technically th
20f20 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
20f30 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73  file system does
20f40 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76   not always prov
20f50 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76  ide powersafe ov
20f60 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f  erwrites.  (In o
20f70 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
20f80 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73  fter a power-los
20f90 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f  s event, parts o
20fa0 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  f the file that 
20fb0 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72  were never.** wr
20fc0 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20  itten might end 
20fd0 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64  up being altered
20fe0 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e  .)  However, non
20ff0 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69  -PSOW behavior i
21000 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20  s very,.** very 
21010 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72  rare.  And asser
21020 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20  ting PSOW makes 
21030 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f  a large reductio
21040 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  n in the amount.
21050 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49  ** of required I
21060 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e  /O for journalin
21070 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f  g, since a lot o
21080 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69  f padding is eli
21090 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e  minated..**  Hen
210a0 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53  ce, while POWERS
210b0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73  AFE_OVERWRITE is
210c0 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20   on by default, 
210d0 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d  there is a file-
210e0 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c  control.** avail
210f0 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
21100 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72  off and URI quer
21110 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69  y parameter avai
21120 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
21130 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
21140 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
21150 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
21160 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
21170 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
21180 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
21190 3b 0a 20 20 73 65 74 44 65 76 69 63 65 43 68 61  ;.  setDeviceCha
211a0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 46 64  racteristics(pFd
211b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d  );.  return pFd-
211c0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
211d0 69 73 74 69 63 73 3b 0a 7d 0a 0a 23 69 66 20 21  istics;.}..#if !
211e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
211f0 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
21200 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
21210 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  >0../*.** Return
21220 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65   the system page
21230 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
21240 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
21250 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
21260 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65  directly by othe
21270 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  r code in this f
21280 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64  ile. .** Instead
21290 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63  , it should be c
212a0 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20  alled via macro 
212b0 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e  osGetpagesize().
212c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
212d0 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76  nixGetpagesize(v
212e0 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  oid){.#if OS_VXW
212f0 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30  ORKS.  return 10
21300 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  24;.#elif define
21310 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20  d(_BSD_SOURCE). 
21320 20 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73   return getpages
21330 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72  ize();.#else.  r
21340 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f  eturn (int)sysco
21350 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29  nf(_SC_PAGESIZE)
21360 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64  ;.#endif.}..#end
21370 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
21380 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
21390 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
213a0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69  AP_SIZE>0 */..#i
213b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
213c0 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  T_WAL../*.** Obj
213d0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
213e0 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
213f0 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
21400 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
21410 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
21420 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
21430 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
21440 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
21450 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
21460 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
21470 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
21480 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
21490 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
214a0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
214b0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
214c0 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
214d0 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
214e0 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
214f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
21500 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
21510 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
21520 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
21530 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
21540 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
21550 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
21560 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
21570 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
21580 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
21590 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
215a0 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
215b0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
215c0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
215d0 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
215e0 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
215f0 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
21600 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
21610 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
21620 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
21630 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
21640 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
21650 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
21660 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
21670 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
21680 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
21690 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
216a0 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
216b0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
216c0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
216d0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
216e0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
216f0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
21700 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
21710 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
21720 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
21730 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
21740 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
21750 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
21760 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
21770 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
21780 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
21790 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
217a0 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
217b0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
217c0 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
217d0 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
217e0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
217f0 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
21800 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
21810 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
21820 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
21830 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
21840 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
21850 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
21860 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
21870 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
21880 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
21890 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
218a0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
218b0 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
218c0 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
218d0 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
218e0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
218f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
21900 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
21910 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
21940 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
21950 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
21960 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
21970 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
21980 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
21990 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
219a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
219b0 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
219c0 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
219d0 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
219e0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
219f0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20  ad-only */.  u8 
21a00 69 73 55 6e 6c 6f 63 6b 65 64 3b 20 20 20 20 20  isUnlocked;     
21a10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
21a20 69 66 20 6e 6f 20 44 4d 53 20 6c 6f 63 6b 20 68  if no DMS lock h
21a30 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  eld */.  char **
21a40 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
21a50 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
21a60 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65  mapped shared-me
21a70 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
21a80 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21aa0 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68  Number of unixSh
21ab0 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
21ac0 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
21ad0 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b  unixShm *pFirst;
21ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
21af0 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  l unixShm object
21b00 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
21b10 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  is */.#ifdef SQL
21b20 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65  ITE_DEBUG.  u8 e
21b30 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
21b40 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
21b50 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
21b60 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73  s held */.  u8 s
21b70 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
21b80 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
21b90 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
21ba0 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74  eld */.  u8 next
21bb0 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
21bc0 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
21bd0 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64  lable unixShm.id
21be0 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
21bf0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63  .};../*.** Struc
21c00 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
21c10 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
21c20 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
21c30 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
21c40 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
21c50 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
21c60 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
21c70 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
21c80 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
21c90 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
21ca0 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
21cb0 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
21cc0 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e  ter:.**.**    un
21cd0 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20  ixShm.pFile.**  
21ce0 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a    unixShm.id.**.
21cf0 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
21d00 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
21d10 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d  te.  The unixShm
21d20 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75  .pFile->mutex mu
21d30 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
21d40 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
21d50 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
21d60 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  lds..*/.struct u
21d70 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53  nixShm {.  unixS
21d80 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
21d90 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  ;     /* The und
21da0 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e  erlying unixShmN
21db0 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
21dc0 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20  unixShm *pNext; 
21dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
21de0 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20  xt unixShm with 
21df0 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d  the same unixShm
21e00 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
21e10 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
21e20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
21e30 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78  holding the unix
21e40 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
21e50 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
21e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21e70 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
21e80 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74  ection within it
21e90 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  s unixShmNode */
21ea0 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
21eb0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
21ec0 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
21ed0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
21ee0 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
21ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
21f00 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
21f10 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b  locks held */.};
21f20 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
21f30 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
21f40 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng.*/.#define UN
21f50 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IX_SHM_BASE   ((
21f60 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
21f70 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20  OCK)*4)         
21f80 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
21f90 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  te */.#define UN
21fa0 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55  IX_SHM_DMS    (U
21fb0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  NIX_SHM_BASE+SQL
21fc0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
21fd0 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
21fe0 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  h */../*.** Impl
21ff0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 66 69  ementation of fi
22000 6c 65 2d 63 6f 6e 74 72 6f 6c 20 53 51 4c 49 54  le-control SQLIT
22010 45 5f 46 43 4e 54 4c 5f 52 45 41 44 5f 53 48 4d  E_FCNTL_READ_SHM
22020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22030 66 63 6e 74 6c 52 65 61 64 53 68 6d 28 75 6e 69  fcntlReadShm(uni
22040 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 76 6f  xFile *pFile, vo
22050 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72  id *pArg){.  str
22060 75 63 74 20 52 65 61 64 53 68 6d 50 61 72 61 6d  uct ReadShmParam
22070 20 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 42 75   {.    void *pBu
22080 66 3b 0a 20 20 20 20 69 6e 74 20 6e 42 75 66 3b  f;.    int nBuf;
22090 0a 20 20 7d 20 2a 70 50 61 72 61 6d 20 3d 20 28  .  } *pParam = (
220a0 73 74 72 75 63 74 20 52 65 61 64 53 68 6d 50 61  struct ReadShmPa
220b0 72 61 6d 2a 29 70 41 72 67 3b 0a 20 20 75 6e 69  ram*)pArg;.  uni
220c0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
220d0 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 53 68 6d  de = pFile->pShm
220e0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e  ->pShmNode;.  in
220f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22100 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
22110 78 5f 65 6e 74 65 72 28 20 70 53 68 6d 4e 6f 64  x_enter( pShmNod
22120 65 2d 3e 6d 75 74 65 78 20 29 3b 0a 20 20 69 66  e->mutex );.  if
22130 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e  ( pShmNode->isUn
22140 6c 6f 63 6b 65 64 3d 3d 31 20 29 7b 0a 20 20 20  locked==1 ){.   
22150 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
22160 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
22170 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72  ed to hold retur
22180 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61  n values of fsta
22190 74 28 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  t() */.    if( o
221a0 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
221b0 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
221c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
221d0 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
221e0 7d 65 6c 73 65 20 69 66 28 20 30 21 3d 6c 73 65  }else if( 0!=lse
221f0 65 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  ek(pShmNode->h, 
22200 30 2c 20 53 45 45 4b 5f 53 45 54 29 20 29 7b 0a  0, SEEK_SET) ){.
22210 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22220 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
22230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
22240 6e 74 20 6e 52 65 61 64 20 3d 20 62 75 66 2e 73  nt nRead = buf.s
22250 74 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  t_size;.      if
22260 28 20 6e 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20  ( nRead==0 ){.  
22270 20 20 20 20 20 20 70 50 61 72 61 6d 2d 3e 6e 42        pParam->nB
22280 75 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  uf = 0;.        
22290 70 50 61 72 61 6d 2d 3e 70 42 75 66 20 3d 20 30  pParam->pBuf = 0
222a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 20  ;.      }else{  
222b0 20 20 0a 20 20 20 20 20 20 20 20 70 50 61 72 61    .        pPara
222c0 6d 2d 3e 70 42 75 66 20 3d 20 73 71 6c 69 74 65  m->pBuf = sqlite
222d0 33 5f 6d 61 6c 6c 6f 63 28 6e 52 65 61 64 29 3b  3_malloc(nRead);
222e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
222f0 72 61 6d 2d 3e 70 42 75 66 20 29 7b 0a 20 20 20  ram->pBuf ){.   
22300 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d         int res =
22310 20 6f 73 52 65 61 64 28 70 53 68 6d 4e 6f 64 65   osRead(pShmNode
22320 2d 3e 68 2c 20 70 50 61 72 61 6d 2d 3e 70 42 75  ->h, pParam->pBu
22330 66 2c 20 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  f, nRead);.     
22340 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 6e 52       if( res!=nR
22350 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ead ){.         
22360 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22370 70 50 61 72 61 6d 2d 3e 70 42 75 66 29 3b 0a 20  pParam->pBuf);. 
22380 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 61             pPara
22390 6d 2d 3e 70 42 75 66 20 3d 20 30 3b 0a 20 20 20  m->pBuf = 0;.   
223a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
223b0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
223c0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
223d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
223e0 61 72 61 6d 2d 3e 6e 42 75 66 20 3d 20 6e 52 65  aram->nBuf = nRe
223f0 61 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ad;.          }.
22400 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22410 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
22420 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
22430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22440 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
22450 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
22460 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71  E_BUSY;.  }.  sq
22470 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
22480 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  e( pShmNode->mut
22490 65 78 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex );.  return r
224a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  c;.}../*.** Appl
224b0 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  y posix advisory
224c0 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62   locks for all b
224d0 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74  ytes from ofst t
224e0 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e  hrough ofst+n-1.
224f0 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f  .**.** Locks blo
22500 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69  ck if the mask i
22510 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53  s exactly UNIX_S
22520 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e  HM_C and are non
22530 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68  -blocking.** oth
22540 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
22550 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73  c int unixShmSys
22560 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 46  temLock(.  unixF
22570 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
22580 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65 63    /* Open connec
22590 74 69 6f 6e 20 74 6f 20 74 68 65 20 57 41 4c 20  tion to the WAL 
225a0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  file */.  int lo
225b0 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
225c0 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52   /* F_UNLCK, F_R
225d0 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b  DLCK, or F_WRLCK
225e0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22600 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
22610 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
22620 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20  */.  int n      
22630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22640 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
22650 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  o lock */.){.  u
22660 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
22670 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c 79 20 6c  Node; /* Apply l
22680 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
22690 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
226a0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 74 72  segment */.  str
226b0 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
226c0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78      /* The posix
226d0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e   advisory lockin
226e0 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  g structure */. 
226f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22700 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c  _OK;    /* Resul
22710 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74  t code form fcnt
22720 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  l() */..  /* Acc
22730 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53  ess to the unixS
22740 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
22750 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
22760 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 70  he caller */.  p
22770 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  ShmNode = pFile-
22780 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
22790 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
227a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
227b0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
227c0 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
227d0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  ef==0 );..  /* S
227e0 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65  hared locks neve
227f0 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e  r span more than
22800 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61   one byte */.  a
22810 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c  ssert( n==1 || l
22820 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b  ockType!=F_RDLCK
22830 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20   );..  /* Locks 
22840 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
22850 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   */.  assert( n>
22860 3d 31 20 26 26 20 6e 3c 3d 53 51 4c 49 54 45 5f  =1 && n<=SQLITE_
22870 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SHM_NLOCK );..  
22880 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
22890 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  =0 ){.    /* Ini
228a0 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
228b0 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
228c0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c  /.    memset(&f,
228d0 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a   0, sizeof(f));.
228e0 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c      f.l_type = l
228f0 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c  ockType;.    f.l
22900 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
22910 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72  ET;.    f.l_star
22920 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e  t = ofst;.    f.
22930 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20  l_len = n;..    
22940 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68  rc = osFcntl(pSh
22950 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  mNode->h, F_SETL
22960 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d  K, &f);.    rc =
22970 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51   (rc!=(-1)) ? SQ
22980 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
22990 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BUSY;.  }..  /*
229a0 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62   Update the glob
229b0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e  al lock state an
229c0 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69  d do debug traci
229d0 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
229e0 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31  ITE_DEBUG.  { u1
229f0 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43  6 mask;.  OSTRAC
22a00 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29  E(("SHM-LOCK "))
22a10 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e  ;.  mask = ofst>
22a20 33 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28 31  31 ? 0xffff : (1
22a30 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
22a40 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72  <<ofst);.  if( r
22a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22a60 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
22a70 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
22a80 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
22a90 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
22aa0 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
22ab0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
22ac0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
22ad0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
22ae0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
22af0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
22b00 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
22b10 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
22b20 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ead-lock %d ok",
22b30 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
22b40 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
22b50 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
22b60 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
22b70 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
22b80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22b90 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
22ba0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
22bb0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
22bc0 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ite-lock %d ok",
22bd0 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
22be0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
22bf0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
22c00 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
22c10 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
22c20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
22c30 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
22c40 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
22c50 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
22c60 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
22c70 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  fst));.    }else
22c80 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
22c90 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
22ca0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
22cb0 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20  ock failed"));. 
22cc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22cd0 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
22ce0 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
22cf0 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
22d00 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  te-lock %d faile
22d10 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
22d20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
22d30 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20  (" - afterwards 
22d40 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
22d50 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
22d60 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  e->sharedMask, p
22d70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
22d80 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  k));.  }.#endif.
22d90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
22da0 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52       .}../*.** R
22db0 65 74 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75  eturn the minimu
22dc0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b 42  m number of 32KB
22dd0 20 73 68 6d 20 72 65 67 69 6f 6e 73 20 74 68 61   shm regions tha
22de0 74 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 70 70  t should be mapp
22df0 65 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c  ed at.** a time,
22e00 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 65   assuming that e
22e10 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  ach mapping must
22e20 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 6d   be an integer m
22e30 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a  ultiple of the.*
22e40 2a 20 63 75 72 72 65 6e 74 20 73 79 73 74 65 6d  * current system
22e50 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a   page-size..**.*
22e60 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  * Usually, this 
22e70 69 73 20 31 2e 20 54 68 65 20 65 78 63 65 70 74  is 1. The except
22e80 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62 65 20  ion seems to be 
22e90 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72 65  systems that are
22ea0 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74   configured.** t
22eb0 6f 20 75 73 65 20 36 34 4b 42 20 70 61 67 65 73  o use 64KB pages
22ec0 20 2d 20 69 6e 20 74 68 69 73 20 63 61 73 65 20   - in this case 
22ed0 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73  each mapping mus
22ee0 74 20 63 6f 76 65 72 20 61 74 20 6c 65 61 73 74  t cover at least
22ef0 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69   two.** shm regi
22f00 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ons..*/.static i
22f10 6e 74 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e  nt unixShmRegion
22f20 50 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20  PerMap(void){.  
22f30 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31  int shmsz = 32*1
22f40 30 32 34 3b 20 20 20 20 20 20 20 20 20 20 20 20  024;            
22f50 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20 73 69  /* SHM region si
22f60 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a  ze */.  int pgsz
22f70 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65   = osGetpagesize
22f80 28 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d 20  ();   /* System 
22f90 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61  page size */.  a
22fa0 73 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31 29  ssert( ((pgsz-1)
22fb0 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f  &pgsz)==0 );   /
22fc0 2a 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73 74  * Page size must
22fd0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
22fe0 20 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c 73   */.  if( pgsz<s
22ff0 68 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31 3b  hmsz ) return 1;
23000 0a 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f 73  .  return pgsz/s
23010 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  hmsz;.}../*.** P
23020 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d  urge the unixShm
23030 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66  NodeList list of
23040 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74   all entries wit
23050 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  h unixShmNode.nR
23060 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ef==0..**.** Thi
23070 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73  s is not a VFS s
23080 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
23090 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69  hod; it is a uti
230a0 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61  lity function ca
230b0 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73  lled.** by VFS s
230c0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
230d0 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
230e0 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67  void unixShmPurg
230f0 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  e(unixFile *pFd)
23100 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
23110 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65  *p = pFd->pInode
23120 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73  ->pShmNode;.  as
23130 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
23140 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70  eld() );.  if( p
23150 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 52   && ALWAYS(p->nR
23160 65 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 6e  ef==0) ){.    in
23170 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75  t nShmPerMap = u
23180 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
23190 61 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b  ap();.    int i;
231a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
231b0 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e  pInode==pFd->pIn
231c0 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ode );.    sqlit
231d0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
231e0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  >mutex);.    for
231f0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
23200 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61  on; i+=nShmPerMa
23210 70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  p){.      if( p-
23220 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
23230 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52   osMunmap(p->apR
23240 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52  egion[i], p->szR
23250 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65  egion);.      }e
23260 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
23270 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
23280 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20  egion[i]);.     
23290 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
232a0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
232b0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20  egion);.    if( 
232c0 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  p->h>=0 ){.     
232d0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
232e0 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  d, p->h, __LINE_
232f0 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d  _);.      p->h =
23300 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
23310 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
23320 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  de = 0;.    sqli
23330 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
23340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4d  .}../*.** The DM
23350 53 20 6c 6f 63 6b 20 68 61 73 20 6e 6f 74 20 79  S lock has not y
23360 65 74 20 62 65 65 6e 20 74 61 6b 65 6e 20 6f 6e  et been taken on
23370 20 73 68 6d 20 66 69 6c 65 20 70 53 68 6d 4e 6f   shm file pShmNo
23380 64 65 2e 20 41 74 74 65 6d 70 74 20 74 6f 0a 2a  de. Attempt to.*
23390 2a 20 74 61 6b 65 20 69 74 20 6e 6f 77 2e 20 52  * take it now. R
233a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
233b0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
233c0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
233d0 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77  r.** code otherw
233e0 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
233f0 65 20 44 4d 53 20 63 61 6e 6e 6f 74 20 62 65 20  e DMS cannot be 
23400 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 20 74  locked because t
23410 68 69 73 20 69 73 20 61 20 72 65 61 64 6f 6e 6c  his is a readonl
23420 79 5f 73 68 6d 3d 31 20 0a 2a 2a 20 63 6f 6e 6e  y_shm=1 .** conn
23430 65 63 74 69 6f 6e 20 61 6e 64 20 6e 6f 20 6f 74  ection and no ot
23440 68 65 72 20 70 72 6f 63 65 73 73 20 61 6c 72 65  her process alre
23450 61 64 79 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b  ady holds a lock
23460 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
23470 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
23480 4c 4f 43 4b 20 61 6e 64 20 73 65 74 20 70 53 68  LOCK and set pSh
23490 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65  mNode->isUnlocke
234a0 64 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d=1..*/.static i
234b0 6e 74 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65  nt unixLockShare
234c0 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65  dMemory(unixFile
234d0 20 2a 70 44 62 46 64 2c 20 75 6e 69 78 53 68 6d   *pDbFd, unixShm
234e0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 29 7b  Node *pShmNode){
234f0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
23500 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
23510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
23520 2a 20 55 73 65 20 46 5f 47 45 54 4c 4b 20 74 6f  * Use F_GETLK to
23530 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c   determine the l
23540 6f 63 6b 73 20 6f 74 68 65 72 20 70 72 6f 63 65  ocks other proce
23550 73 73 65 73 20 61 72 65 20 68 6f 6c 64 69 6e 67  sses are holding
23560 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 44 4d 53  .  ** on the DMS
23570 20 62 79 74 65 2e 20 49 66 20 69 74 20 69 6e 64   byte. If it ind
23580 69 63 61 74 65 73 20 74 68 61 74 20 61 6e 6f 74  icates that anot
23590 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
235a0 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 61 20 53 48  olding.  ** a SH
235b0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  ARED lock, then 
235c0 74 68 69 73 20 70 72 6f 63 65 73 73 20 6d 61 79  this process may
235d0 20 61 6c 73 6f 20 74 61 6b 65 20 61 20 53 48 41   also take a SHA
235e0 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e  RED lock.  ** an
235f0 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 6f  d proceed with o
23600 70 65 6e 69 6e 67 20 74 68 65 20 2a 2d 73 68 6d  pening the *-shm
23610 20 66 69 6c 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a   file. .  **.  *
23620 2a 20 4f 72 2c 20 69 66 20 6e 6f 20 6f 74 68 65  * Or, if no othe
23630 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
23640 64 69 6e 67 20 61 6e 79 20 6c 6f 63 6b 2c 20 74  ding any lock, t
23650 68 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73  hen this process
23660 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 66 69 72  .  ** is the fir
23670 73 74 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20 49  st to open it. I
23680 6e 20 74 68 69 73 20 63 61 73 65 20 74 61 6b 65  n this case take
23690 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
236a0 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 44  ck on the.  ** D
236b0 4d 53 20 62 79 74 65 20 61 6e 64 20 74 72 75 6e  MS byte and trun
236c0 63 61 74 65 20 74 68 65 20 2a 2d 73 68 6d 20 66  cate the *-shm f
236d0 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
236e0 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 65 6e 0a  s in size. Then.
236f0 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 20 74    ** downgrade t
23700 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  o a SHARED lock 
23710 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74 65 2e  on the DMS byte.
23720 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
23730 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
23740 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
23750 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
23760 65 20 44 4d 53 20 62 79 74 65 2c 0a 20 20 2a 2a  e DMS byte,.  **
23770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
23780 55 53 59 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  USY to the calle
23790 72 20 28 69 74 20 77 69 6c 6c 20 74 72 79 20 61  r (it will try a
237a0 67 61 69 6e 29 2e 20 41 6e 20 65 61 72 6c 69 65  gain). An earlie
237b0 72 0a 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 6f  r.  ** version o
237c0 66 20 74 68 69 73 20 63 6f 64 65 20 61 74 74 65  f this code atte
237d0 6d 70 74 65 64 20 74 68 65 20 53 48 41 52 45 44  mpted the SHARED
237e0 20 6c 6f 63 6b 20 61 74 20 74 68 69 73 20 70 6f   lock at this po
237f0 69 6e 74 2e 20 42 75 74 0a 20 20 2a 2a 20 74 68  int. But.  ** th
23800 69 73 20 69 6e 74 72 6f 64 75 63 65 64 20 61 20  is introduced a 
23810 73 75 62 74 6c 65 20 72 61 63 65 20 63 6f 6e 64  subtle race cond
23820 69 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 70 72  ition: if the pr
23830 6f 63 65 73 73 20 68 6f 6c 64 69 6e 67 0a 20 20  ocess holding.  
23840 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 66 61 69  ** EXCLUSIVE fai
23850 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20  led just before 
23860 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 2a  truncating the *
23870 2d 73 68 6d 20 66 69 6c 65 2c 20 74 68 65 6e 20  -shm file, then 
23880 74 68 69 73 0a 20 20 2a 2a 20 70 72 6f 63 65 73  this.  ** proces
23890 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 61 6e 64  s might open and
238a0 20 75 73 65 20 74 68 65 20 2a 2d 73 68 6d 20 66   use the *-shm f
238b0 69 6c 65 20 77 69 74 68 6f 75 74 20 74 72 75 6e  ile without trun
238c0 63 61 74 69 6e 67 20 69 74 2e 0a 20 20 2a 2a 20  cating it..  ** 
238d0 41 6e 64 20 69 66 20 74 68 65 20 2a 2d 73 68 6d  And if the *-shm
238e0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
238f0 6f 72 72 75 70 74 65 64 20 62 79 20 61 20 70 6f  orrupted by a po
23900 77 65 72 20 66 61 69 6c 75 72 65 20 6f 72 0a 20  wer failure or. 
23910 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68   ** system crash
23920 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  , the database i
23930 74 73 65 6c 66 20 6d 61 79 20 61 6c 73 6f 20 62  tself may also b
23940 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 20  ecome corrupt.  
23950 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  */.  lock.l_when
23960 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
23970 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
23980 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 3b 0a 20 20  UNIX_SHM_DMS;.  
23990 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  lock.l_len = 1;.
239a0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
239b0 46 5f 57 52 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_WRLCK;.  if( o
239c0 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d  sFcntl(pShmNode-
239d0 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
239e0 63 6b 29 21 3d 30 20 29 20 7b 0a 20 20 20 20 72  ck)!=0 ) {.    r
239f0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
23a00 5f 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  _LOCK;.  }else i
23a10 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d  f( lock.l_type==
23a20 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 69  F_UNLCK ){.    i
23a30 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52  f( pShmNode->isR
23a40 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadonly ){.     
23a50 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c   pShmNode->isUnl
23a60 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ocked = 1;.     
23a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
23a80 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3b 0a  DONLY_CANTLOCK;.
23a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23aa0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
23ab0 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
23ac0 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
23ad0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
23ae0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23af0 4b 20 26 26 20 72 6f 62 75 73 74 5f 66 74 72 75  K && robust_ftru
23b00 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
23b10 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  h, 0) ){.       
23b20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
23b30 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
23b40 53 48 4d 4f 50 45 4e 2c 22 66 74 72 75 6e 63 61  SHMOPEN,"ftrunca
23b50 74 65 22 2c 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  te",pShmNode->zF
23b60 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
23b70 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
23b80 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d  if( lock.l_type=
23b90 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
23ba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
23bb0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
23bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23bd0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 2e 6c    assert( lock.l
23be0 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 7c  _type==F_UNLCK |
23bf0 7c 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46  | lock.l_type==F
23c00 5f 52 44 4c 43 4b 20 29 3b 0a 20 20 20 20 72 63  _RDLCK );.    rc
23c10 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
23c20 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44  Lock(pDbFd, F_RD
23c30 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
23c40 53 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  S, 1);.  }.  ret
23c50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23c60 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d   Open a shared-m
23c70 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63  emory area assoc
23c80 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20  iated with open 
23c90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44  database file pD
23ca0 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70  bFd.  .** This p
23cb0 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d  articular implem
23cc0 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d  entation uses mm
23cd0 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a  apped files..**.
23ce0 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64  ** The file used
23cf0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68   to implement sh
23d00 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69  ared-memory is i
23d10 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
23d20 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f  tory.** as the o
23d30 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
23d40 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  e and has the sa
23d50 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
23d60 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  pen database.** 
23d70 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d  file with the "-
23d80 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65  shm" suffix adde
23d90 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  d.  For example,
23da0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
23db0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f   file.** is "/ho
23dc0 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
23dd0 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c  db" then the fil
23de0 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  e that is create
23df0 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a  d and mmapped.**
23e00 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f   for shared memo
23e10 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ry will be calle
23e20 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  d "/home/user1/c
23e30 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20  onfig.db-shm".  
23e40 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61  .**.** Another a
23e50 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f  pproach to is to
23e60 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64   use files in /d
23e70 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74  ev/shm or /dev/t
23e80 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65  mp or an.** some
23e90 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75   other tmpfs mou
23ea0 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c  nt. But if a fil
23eb0 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  e in a different
23ec0 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72   directory.** fr
23ed0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
23ee0 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68  file is used, th
23ef0 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 63  en differing acc
23f00 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  ess permissions.
23f10 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29  ** or a chroot()
23f20 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77 6f   might cause two
23f30 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65   different proce
23f40 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sses on the same
23f50 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20  .** database to 
23f60 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69 66  end up using dif
23f70 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72  ferent files for
23f80 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d   shared memory -
23f90 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61   .** meaning tha
23fa0 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77  t their memory w
23fb0 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20  ould not really 
23fc0 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73 75  be shared - resu
23fd0 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61  lting.** in data
23fe0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
23ff0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
24000 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20  this tmpfs file 
24010 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20  usage.** can be 
24020 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
24030 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44  le-time using -D
24040 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
24050 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a  TORY="/dev/shm".
24060 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76 61  ** or the equiva
24070 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f  lent.  The use o
24080 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d  f the SQLITE_SHM
24090 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69  _DIRECTORY compi
240a0 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f  le-time.** optio
240b0 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20  n results in an 
240c0 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69  incompatible bui
240d0 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62  ld of SQLite;  b
240e0 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a  uilds of SQLite.
240f0 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69 66  ** that with dif
24100 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48  fering SQLITE_SH
24110 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74 74  M_DIRECTORY sett
24120 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20  ings attempt to 
24130 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  use the.** same 
24140 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
24150 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
24160 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
24170 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  ion will likely.
24180 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53  ** result. The S
24190 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
241a0 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ORY compile-time
241b0 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69   option is consi
241c0 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70  dered.** "unsupp
241d0 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67  orted" and may g
241e0 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74 75  o away in a futu
241f0 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73  re SQLite releas
24200 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  e..**.** When op
24210 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
24220 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
24230 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
24240 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
24250 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
24260 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
24270 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
24280 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
24290 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
242a0 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
242b0 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
242c0 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
242d0 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
242e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67  *.** If the orig
242f0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
24300 6c 65 20 28 70 44 62 46 64 29 20 69 73 20 75 73  le (pDbFd) is us
24310 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78  ing the "unix-ex
24320 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20  cl" VFS.** that 
24330 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78  means that an ex
24340 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
24350 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
24360 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a  base file and.**
24370 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
24380 72 6f 63 65 73 73 65 73 20 61 72 65 20 61 62 6c  rocesses are abl
24390 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  e to read or wri
243a0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  te the database.
243b0 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73    In.** that cas
243c0 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61  e, we do not rea
243d0 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64 20  lly need shared 
243e0 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72  memory.  No shar
243f0 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c  ed memory.** fil
24400 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
24410 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
24420 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74   will be simulat
24430 65 64 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d  ed with heap mem
24440 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
24450 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65  nt unixOpenShare
24460 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65  dMemory(unixFile
24470 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75   *pDbFd){.  stru
24480 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  ct unixShm *p = 
24490 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  0;          /* T
244a0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
244b0 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
244c0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f  struct unixShmNo
244d0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
244e0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
244f0 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  g mmapped file *
24500 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
24510 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
24520 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
24530 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  de */.  unixInod
24540 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
24550 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
24560 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20  node of fd */.  
24570 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61  char *zShmFilena
24580 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
24590 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
245a0 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d  ile used for SHM
245b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69   */.  int nShmFi
245c0 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
245d0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
245e0 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d   the SHM filenam
245f0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
24600 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
24610 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  ce for the new u
24620 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a  nixShm object. *
24630 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  /.  p = sqlite3_
24640 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66  malloc64( sizeof
24650 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
24660 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
24670 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
24680 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
24690 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73  zeof(*p));.  ass
246a0 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d  ert( pDbFd->pShm
246b0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
246c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 75  ck to see if a u
246d0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
246e0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
246f0 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69 73 74  . Reuse an exist
24700 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20  ing.  ** one if 
24710 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20  present. Create 
24720 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
24730 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75  essary..  */.  u
24740 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
24750 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46  .  pInode = pDbF
24760 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68  d->pInode;.  pSh
24770 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  mNode = pInode->
24780 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20  pShmNode;.  if( 
24790 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  pShmNode==0 ){. 
247a0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
247b0 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
247c0 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29        /* fstat()
247d0 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61   info for databa
247e0 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64  se file */.#ifnd
247f0 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
24800 52 45 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73  RECTORY.    cons
24810 74 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74  t char *zBasePat
24820 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  h = pDbFd->zPath
24830 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
24840 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f   Call fstat() to
24850 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
24860 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
24870 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24880 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65  . If.    ** a ne
24890 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20  w *-shm file is 
248a0 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65  created, an atte
248b0 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  mpt will be made
248c0 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20   to create it.  
248d0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61    ** with the sa
248e0 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a  me permissions..
248f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
24900 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c  sFstat(pDbFd->h,
24910 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
24920 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
24930 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20  ERR_FSTAT;.     
24940 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
24950 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  rr;.    }..#ifde
24960 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
24970 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46  ECTORY.    nShmF
24980 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66  ilename = sizeof
24990 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  (SQLITE_SHM_DIRE
249a0 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c  CTORY) + 31;.#el
249b0 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  se.    nShmFilen
249c0 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73  ame = 6 + (int)s
249d0 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29  trlen(zBasePath)
249e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
249f0 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  mNode = sqlite3_
24a00 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66  malloc64( sizeof
24a10 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53  (*pShmNode) + nS
24a20 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20  hmFilename );.  
24a30 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
24a40 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
24a50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
24a60 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
24a70 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
24a80 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68  }.    memset(pSh
24a90 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mNode, 0, sizeof
24aa0 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d  (*pShmNode)+nShm
24ab0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
24ac0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53  ShmFilename = pS
24ad0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
24ae0 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d  e = (char*)&pShm
24af0 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20  Node[1];.#ifdef 
24b00 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
24b10 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33  TORY.    sqlite3
24b20 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
24b30 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65  lename, zShmFile
24b40 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20  name, .         
24b50 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
24b60 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
24b70 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78   "/sqlite-shm-%x
24b80 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  -%x",.          
24b90 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
24ba0 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75  sStat.st_ino, (u
24bb0 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29  32)sStat.st_dev)
24bc0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69  ;.#else.    sqli
24bd0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
24be0 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
24bf0 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d  ilename, "%s-shm
24c00 22 2c 20 7a 42 61 73 65 50 61 74 68 29 3b 0a 20  ", zBasePath);. 
24c10 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
24c20 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61  ffix3(pDbFd->zPa
24c30 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  th, zShmFilename
24c40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53  );.#endif.    pS
24c50 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a  hmNode->h = -1;.
24c60 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64      pDbFd->pInod
24c70 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  e->pShmNode = pS
24c80 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d  hmNode;.    pShm
24c90 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70  Node->pInode = p
24ca0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
24cb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
24cc0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
24cd0 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70 53  utex ){.      pS
24ce0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20  hmNode->mutex = 
24cf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
24d00 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
24d10 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 69 66  _FAST);.      if
24d20 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
24d30 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
24d40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
24d50 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
24d60 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
24d70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
24d80 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ..    if( pInode
24d90 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
24da0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
24db0 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
24dc0 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20  R | O_CREAT;.   
24dd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75     if( sqlite3_u
24de0 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64  ri_boolean(pDbFd
24df0 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e  ->zPath, "readon
24e00 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20  ly_shm", 0) ){. 
24e10 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73         openFlags
24e20 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
24e30 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
24e40 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
24e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
24e60 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
24e70 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e  t_open(zShmFilen
24e80 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
24e90 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30  (sStat.st_mode&0
24ea0 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28  777));.      if(
24eb0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29   pShmNode->h<0 )
24ec0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
24ed0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
24ee0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
24ef0 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69  , "open", zShmFi
24f00 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
24f10 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
24f20 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rr;.      }..   
24f30 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72     /* If this pr
24f40 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67  ocess is running
24f50 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73   as root, make s
24f60 75 72 65 20 74 68 61 74 20 74 68 65 20 53 48 4d  ure that the SHM
24f70 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69   file.      ** i
24f80 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73  s owned by the s
24f90 61 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f 77  ame user that ow
24fa0 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ns the original 
24fb0 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72  database.  Other
24fc0 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  wise,.      ** t
24fd0 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65  he original owne
24fe0 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  r will not be ab
24ff0 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20  le to connect.. 
25000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f       */.      ro
25010 62 75 73 74 46 63 68 6f 77 6e 28 70 53 68 6d 4e  bustFchown(pShmN
25020 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74  ode->h, sStat.st
25030 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67  _uid, sStat.st_g
25040 69 64 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  id);..      rc =
25050 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d   unixLockSharedM
25060 65 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53 68  emory(pDbFd, pSh
25070 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66  mNode);.      if
25080 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25090 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 45  && rc!=SQLITE_RE
250a0 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 20  ADONLY_CANTLOCK 
250b0 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
250c0 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  err;.    }.  }..
250d0 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
250e0 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
250f0 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78  hild of the unix
25100 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
25110 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
25120 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
25130 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
25140 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
25150 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
25160 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
25170 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
25180 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65  hm = p;.  unixLe
25190 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  aveMutex();..  /
251a0 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20  * The reference 
251b0 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64  count on pShmNod
251c0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
251d0 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75  en incremented u
251e0 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f  nder.  ** the co
251f0 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45  ver of the unixE
25200 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65  nterMutex() mute
25210 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65  x and the pointe
25220 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  r from the.  ** 
25230 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e 69 78  new (struct unix
25240 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74  Shm) object to t
25250 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  he pShmNode has 
25260 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68  been set. All th
25270 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20  at is.  ** left 
25280 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b  to do is to link
25290 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
252a0 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
252b0 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20  list starting.  
252c0 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  ** at pShmNode->
252d0 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73  pFirst. This mus
252e0 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20  t be done while 
252f0 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d  holding the pShm
25300 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a  Node->mutex .  *
25310 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20  * mutex..  */.  
25320 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
25330 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
25340 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  tex);.  p->pNext
25350 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69   = pShmNode->pFi
25360 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  rst;.  pShmNode-
25370 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73  >pFirst = p;.  s
25380 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
25390 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
253a0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
253b0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
253c0 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a  e on any error *
253d0 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a  /.shm_open_err:.
253e0 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
253f0 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20  DbFd);       /* 
25400 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20  This call frees 
25410 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75  pShmNode if requ
25420 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
25430 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69  3_free(p);.  uni
25440 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
25450 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25460 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25470 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
25480 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
25490 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
254a0 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68  on of the .** sh
254b0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f  ared-memory asso
254c0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
254d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64  database file fd
254e0 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  . Shared-memory 
254f0 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20  regions .** are 
25500 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
25510 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63  g from zero. Eac
25520 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  h shared-memory 
25530 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69  region is szRegi
25540 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  on .** bytes in 
25550 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
25560 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
25570 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
25580 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
25590 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
255a0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
255b0 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e  e, if the bExten
255c0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
255d0 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
255e0 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
255f0 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  .** region has n
25600 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
25610 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  d (by any client
25620 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20  , including one 
25630 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20  running in a.** 
25640 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
25650 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73  ), then *pp is s
25660 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
25670 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
25680 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e  d. If .** bExten
25690 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  d is non-zero an
256a0 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
256b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
256c0 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  gion has not yet
256d0 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61   .** been alloca
256e0 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63  ted, it is alloc
256f0 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
25700 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
25710 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
25720 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72  y region has alr
25730 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
25740 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61  ted or is alloca
25750 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63  ted by.** this c
25760 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64  all as described
25770 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20   above, then it 
25780 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  is mapped into t
25790 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a  his processes .*
257a0 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20  * address space 
257b0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
257c0 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73  ready), *pp is s
257d0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
257e0 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65  he mapped .** me
257f0 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
25800 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
25810 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
25820 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  hmMap(.  sqlite3
25830 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
25840 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
25850 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62  le open on datab
25860 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
25870 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20  t iRegion,      
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25890 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69   Region to retri
258a0 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  eve */.  int szR
258b0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
258c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
258d0 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20   of regions */. 
258e0 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20   int bExtend,   
258f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25900 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65   /* True to exte
25910 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73  nd file if neces
25920 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76  sary */.  void v
25930 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20  olatile **pp    
25940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
25950 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  : Mapped memory 
25960 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
25970 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
25980 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53  ile*)fd;.  unixS
25990 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d  hm *p;.  unixShm
259a0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a  Node *pShmNode;.
259b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
259c0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d  E_OK;.  int nShm
259d0 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d  PerMap = unixShm
259e0 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a  RegionPerMap();.
259f0 20 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e    int nReqRegion
25a00 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
25a10 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
25a20 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
25a30 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
25a40 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28  it now. */.  if(
25a50 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
25a60 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  ){.    rc = unix
25a70 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
25a80 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28  (pDbFd);.    if(
25a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25aa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
25ab0 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
25ac0 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  hm;.  pShmNode =
25ad0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20   p->pShmNode;.  
25ae0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
25af0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
25b00 74 65 78 29 3b 0a 20 20 69 66 28 20 70 53 68 6d  tex);.  if( pShm
25b10 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64  Node->isUnlocked
25b20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
25b30 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72  xLockSharedMemor
25b40 79 28 70 44 62 46 64 2c 20 70 53 68 6d 4e 6f 64  y(pDbFd, pShmNod
25b50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
25b60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
25b70 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
25b80 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e    pShmNode->isUn
25b90 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  locked = 0;.  }.
25ba0 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69    assert( szRegi
25bb0 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  on==pShmNode->sz
25bc0 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f  Region || pShmNo
25bd0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29  de->nRegion==0 )
25be0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
25bf0 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
25c00 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
25c10 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
25c20 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
25c30 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
25c40 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
25c50 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
25c60 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
25c70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
25c80 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ock==0 );..  /* 
25c90 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Minimum number o
25ca0 66 20 72 65 67 69 6f 6e 73 20 72 65 71 75 69 72  f regions requir
25cb0 65 64 20 74 6f 20 62 65 20 6d 61 70 70 65 64 2e  ed to be mapped.
25cc0 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69 6f 6e   */.  nReqRegion
25cd0 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e 53 68   = ((iRegion+nSh
25ce0 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53 68 6d 50  mPerMap) / nShmP
25cf0 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50 65 72  erMap) * nShmPer
25d00 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  Map;..  if( pShm
25d10 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52  Node->nRegion<nR
25d20 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  eqRegion ){.    
25d30 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20  char **apNew;   
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d50 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69     /* New apRegi
25d60 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
25d70 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 52    int nByte = nR
25d80 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  eqRegion*szRegio
25d90 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  n;   /* Minimum 
25da0 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
25db0 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
25dc0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
25dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25de0 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20  Used by fstat() 
25df0 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  */..    pShmNode
25e00 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52  ->szRegion = szR
25e10 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20  egion;..    if( 
25e20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
25e30 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
25e40 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
25e50 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
25e60 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
25e70 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
25e80 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  .      ** Check 
25e90 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
25ea0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
25eb0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
25ec0 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
25ed0 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e       ** large en
25ee0 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ough to contain 
25ef0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
25f00 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  gion)..      */.
25f10 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
25f20 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26  t(pShmNode->h, &
25f30 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
25f40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
25f50 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20  ERR_SHMSIZE;.   
25f60 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
25f70 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
25f80 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61   .      if( sSta
25f90 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20  t.st_size<nByte 
25fa0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
25fb0 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
25fc0 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
25fd0 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78  ot exist. If bEx
25fe0 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20  tend is set to. 
25ff0 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c         ** false,
26000 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
26010 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
26020 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
26030 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
26040 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26050 69 66 28 20 21 62 45 78 74 65 6e 64 20 29 7b 0a  if( !bExtend ){.
26060 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
26070 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
26080 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
26090 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
260a0 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74   if bExtend is t
260b0 72 75 65 2c 20 65 78 74 65 6e 64 20 74 68 65 20  rue, extend the 
260c0 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62 79  file. Do this by
260d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74  .        ** writ
260e0 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
260f0 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
26100 65 61 63 68 20 28 4f 53 29 20 70 61 67 65 20 62  each (OS) page b
26110 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  eing.        ** 
26120 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74  allocated or ext
26130 65 6e 64 65 64 2e 20 54 65 63 68 6e 69 63 61 6c  ended. Technical
26140 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c 79  ly, we need only
26150 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20   write to the.  
26160 20 20 20 20 20 20 2a 2a 20 6c 61 73 74 20 70 61        ** last pa
26170 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65  ge in order to e
26180 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20  xtend the file. 
26190 42 75 74 20 77 72 69 74 69 6e 67 20 74 6f 20 61  But writing to a
261a0 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a  ll new.        *
261b0 2a 20 70 61 67 65 73 20 66 6f 72 63 65 73 20 74  * pages forces t
261c0 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61 74  he OS to allocat
261d0 65 20 74 68 65 6d 20 69 6d 6d 65 64 69 61 74 65  e them immediate
261e0 6c 79 2c 20 77 68 69 63 68 20 72 65 64 75 63 65  ly, which reduce
261f0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  s.        ** the
26200 20 63 68 61 6e 63 65 73 20 6f 66 20 53 49 47 42   chances of SIGB
26210 55 53 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  US while accessi
26220 6e 67 20 74 68 65 20 6d 61 70 70 65 64 20 72 65  ng the mapped re
26230 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a 20  gion later on.. 
26240 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26250 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
26260 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
26270 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b 0a  nt pgsz = 4096;.
26280 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
26290 67 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  g;..          /*
262a0 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 6c 61   Write to the la
262b0 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68 20  st byte of each 
262c0 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
262d0 6f 72 20 65 78 74 65 6e 64 65 64 20 70 61 67 65  or extended page
262e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
262f0 73 65 72 74 28 20 28 6e 42 79 74 65 20 25 20 70  sert( (nByte % p
26300 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  gsz)==0 );.     
26310 20 20 20 20 20 66 6f 72 28 69 50 67 3d 28 73 53       for(iPg=(sS
26320 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73 7a  tat.st_size/pgsz
26330 29 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f 70 67  ); iPg<(nByte/pg
26340 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20  sz); iPg++){.   
26350 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d           int x =
26360 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
26370 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65  if( seekAndWrite
26380 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  Fd(pShmNode->h, 
26390 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d  iPg*pgsz + pgsz-
263a0 31 2c 20 22 22 2c 20 31 2c 20 26 78 29 21 3d 31  1, "", 1, &x)!=1
263b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
263c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
263d0 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ile = pShmNode->
263e0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
263f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
26400 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
26410 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
26420 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65 29   "write", zFile)
26430 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26440 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
26450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26460 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26470 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
26480 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
26490 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
264a0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
264b0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
264c0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
264d0 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63  /.    apNew = (c
264e0 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  har **)sqlite3_r
264f0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
26500 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
26510 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73  on, nReqRegion*s
26520 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20  izeof(char *).  
26530 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
26540 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
26550 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
26560 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
26570 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
26580 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
26590 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20  mNode->apRegion 
265a0 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69  = apNew;.    whi
265b0 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  le( pShmNode->nR
265c0 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e  egion<nReqRegion
265d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d   ){.      int nM
265e0 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53  ap = szRegion*nS
265f0 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 20 20  hmPerMap;.      
26600 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 76 6f 69  int i;.      voi
26610 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  d *pMem;.      i
26620 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
26630 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 ){.        pMe
26640 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d  m = osMmap(0, nM
26650 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ap,.            
26660 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
26670 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44  only ? PROT_READ
26680 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f   : PROT_READ|PRO
26690 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20  T_WRITE, .      
266a0 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44        MAP_SHARED
266b0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73  , pShmNode->h, s
266c0 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68  zRegion*(i64)pSh
266d0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20  mNode->nRegion. 
266e0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
266f0 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f    if( pMem==MAP_
26700 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
26710 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
26720 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
26730 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70  RR_SHMMAP, "mmap
26740 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  ", pShmNode->zFi
26750 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
26760 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
26770 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
26780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26790 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74      pMem = sqlit
267a0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65  e3_malloc64(szRe
267b0 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  gion);.        i
267c0 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  f( pMem==0 ){.  
267d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
267e0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
267f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
26800 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
26810 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
26820 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a  mset(pMem, 0, sz
26830 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
26840 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
26850 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b 20 69   i<nShmPerMap; i
26860 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  ++){.        pSh
26870 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
26880 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
26890 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61 72 2a 29  n+i] = &((char*)
268a0 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a 69  pMem)[szRegion*i
268b0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
268c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
268d0 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d 61 70  on += nShmPerMap
268e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
268f0 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
26900 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
26910 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
26920 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d   *pp = pShmNode-
26930 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  >apRegion[iRegio
26940 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n];.  }else{.   
26950 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
26960 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
26970 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d  Readonly && rc==
26980 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
26990 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
269a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
269b0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
269c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
269d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
269e0 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
269f0 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
26a00 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
26a10 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  t..**.** Note th
26a20 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  at the relations
26a30 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52  hip between SHAR
26a40 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45  Ed and EXCLUSIVE
26a50 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74   locks is a litt
26a60 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  le.** different 
26a70 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73  here than in pos
26a80 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b  ix.  In xShmLock
26a90 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66  (), one can go f
26aa0 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20  rom unlocked.** 
26ab0 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61  to shared and ba
26ac0 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63  ck or from unloc
26ad0 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ked to exclusive
26ae0 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20   and back.  But 
26af0 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67  one may.** not g
26b00 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f  o from shared to
26b10 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72   exclusive or fr
26b20 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20  om exclusive to 
26b30 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  shared..*/.stati
26b40 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63  c int unixShmLoc
26b50 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
26b60 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
26b70 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
26b80 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
26b90 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
26ba0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
26bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
26bc0 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
26bd0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
26be0 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26c00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
26c10 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
26c20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
26c30 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
26c40 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
26c50 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
26c60 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ock */.){.  unix
26c70 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
26c80 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  nixFile*)fd;    
26c90 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
26ca0 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
26cb0 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53  emory */.  unixS
26cc0 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
26cd0 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
26ce0 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
26cf0 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
26d00 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ed */.  unixShm 
26d10 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d30 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
26d40 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
26d50 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
26d60 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
26d70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65  ShmNode;  /* The
26d80 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
26d90 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   iNode */.  int 
26da0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
26dd0 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
26e00 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
26e10 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
26e20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  */..  assert( pS
26e30 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
26e40 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
26e50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
26e60 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
26e70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
26e80 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
26e90 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
26ea0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
26eb0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
26ec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
26ed0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
26ee0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
26ef0 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
26f00 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
26f10 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
26f20 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
26f30 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
26f40 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
26f50 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
26f60 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
26f70 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
26f80 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
26f90 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
26fa0 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
26fb0 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
26fc0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
26fd0 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
26fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
26ff0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
27000 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
27010 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
27020 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
27030 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
27040 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
27050 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
27060 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73   mask = (1<<(ofs
27070 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
27080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
27090 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
270a0 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
270b0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
270c0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
270d0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
270e0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
270f0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
27100 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
27110 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
27120 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
27130 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
27140 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
27150 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
27160 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
27170 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
27180 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
27190 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
271a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
271b0 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
271c0 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
271d0 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
271e0 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
271f0 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
27200 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
27210 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
27220 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
27230 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
27240 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
27250 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
27260 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
27270 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
27280 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _UNLCK, ofst+UNI
27290 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
272a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
272b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
272c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
272d0 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ndo the local lo
272e0 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
272f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27300 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
27310 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
27320 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
27330 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20  &= ~mask;.    } 
27340 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
27350 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
27360 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31  SHARED ){.    u1
27370 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b  6 allShared = 0;
27380 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f    /* Union of lo
27390 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
273a0 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68  ections other th
273b0 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f  an "p" */..    /
273c0 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68  * Find out which
273d0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72   shared locks ar
273e0 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  e already held b
273f0 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  y sibling connec
27400 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66  tions..    ** If
27410 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
27420 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
27430 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
27440 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
27450 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
27460 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  BUSY..    */.   
27470 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
27480 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
27490 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
274a0 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
274b0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
274c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
274d0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
274e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
274f0 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61    }.      allSha
27500 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
27510 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
27520 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20    /* Get shared 
27530 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
27540 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65  tem level, if ne
27550 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
27560 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27570 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61   ){.      if( (a
27580 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29  llShared & mask)
27590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
275a0 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
275b0 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52  mLock(pDbFd, F_R
275c0 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  DLCK, ofst+UNIX_
275d0 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
275e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
275f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
27600 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
27610 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
27620 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f   local shared lo
27630 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
27640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27650 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
27660 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
27670 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
27680 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
27690 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
276a0 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
276b0 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
276c0 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e  his.    ** lock.
276d0 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
276e0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
276f0 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20  right away..    
27700 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
27710 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
27720 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
27730 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
27740 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
27750 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68  k)!=0 || (pX->sh
27760 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
27770 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
27780 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
27790 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
277a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
277b0 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
277c0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
277d0 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
277e0 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
277f0 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
27800 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
27810 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
27820 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
27830 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
27840 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27850 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
27860 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
27870 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73  Fd, F_WRLCK, ofs
27880 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
27890 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
278a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
278b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
278c0 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
278d0 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
278e0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
278f0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
27900 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
27910 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
27920 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
27930 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
27940 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
27950 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
27960 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
27970 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 6f 73         p->id, os
27980 47 65 74 70 69 64 28 30 29 2c 20 70 2d 3e 73 68  Getpid(0), p->sh
27990 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
279a0 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72  lMask));.  retur
279b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
279c0 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
279d0 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
279e0 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
279f0 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a  red memory.  .**
27a00 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
27a10 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
27a20 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
27a30 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
27a40 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
27a50 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
27a60 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
27a70 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
27a80 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69  oid unixShmBarri
27a90 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
27aa0 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
27ab0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
27ac0 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
27ad0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
27ae0 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
27af0 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
27b00 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61   sqlite3MemoryBa
27b10 72 72 69 65 72 28 29 3b 20 20 20 20 20 20 20 20  rrier();        
27b20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64 65 66   /* compiler-def
27b30 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61 72 72  ined memory barr
27b40 69 65 72 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ier */.  unixEnt
27b50 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20  erMutex();      
27b60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f           /* Also
27b70 20 6d 75 74 65 78 2c 20 66 6f 72 20 72 65 64 75   mutex, for redu
27b80 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75 6e 69 78  ndancy */.  unix
27b90 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
27ba0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
27bb0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
27bc0 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
27bd0 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
27be0 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ng .** storage i
27bf0 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
27c00 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
27c10 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65  here is no share
27c20 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d memory associa
27c30 74 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ted with the con
27c40 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69  nection then thi
27c50 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
27c60 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
27c70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27c80 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20  unixShmUnmap(.  
27c90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
27ca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27cb0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
27cc0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
27cd0 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
27ce0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
27cf0 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73       /* Delete s
27d00 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20  hared-memory if 
27d10 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  true */.){.  uni
27d20 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  xShm *p;        
27d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27d40 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
27d50 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
27d60 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
27d70 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
27d80 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
27d90 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
27da0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53   file */.  unixS
27db0 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20  hm **pp;        
27dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
27dd0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
27de0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
27df0 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ns */.  unixFile
27e00 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20   *pDbFd;        
27e10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
27e20 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
27e30 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44  se file */..  pD
27e40 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
27e50 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
27e60 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
27e70 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
27e80 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
27e90 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
27ea0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
27eb0 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
27ec0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
27ed0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
27ee0 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
27ef0 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20  Fd->pInode );.. 
27f00 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
27f10 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
27f20 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
27f30 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
27f40 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
27f50 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
27f60 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
27f70 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
27f80 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
27f90 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
27fa0 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
27fb0 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
27fc0 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
27fd0 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
27fe0 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
27ff0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
28000 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
28010 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
28020 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
28030 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
28040 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
28050 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
28060 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
28070 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
28080 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
28090 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45  , too */.  unixE
280a0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
280b0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
280c0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68  >nRef>0 );.  pSh
280d0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  mNode->nRef--;. 
280e0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
280f0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref==0 ){.    if
28100 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20  ( deleteFlag && 
28110 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
28120 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  {.      osUnlink
28130 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
28140 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
28150 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
28160 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  bFd);.  }.  unix
28170 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
28180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28190 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64  K;.}...#else.# d
281a0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70  efine unixShmMap
281b0 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
281c0 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30  unixShmLock    0
281d0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
281e0 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
281f0 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  ine unixShmUnmap
28200 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
28210 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28220 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53  IT_WAL */..#if S
28230 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
28240 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69  IZE>0./*.** If i
28250 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d  t is currently m
28260 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e  emory mapped, un
28270 6d 61 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f  map file pFd..*/
28280 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
28290 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
282a0 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73  ile *pFd){.  ass
282b0 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
282c0 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Out==0 );.  if( 
282d0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
282e0 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  ){.    osMunmap(
282f0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c  pFd->pMapRegion,
28300 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
28310 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e  tual);.    pFd->
28320 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
28330 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
28340 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e  e = 0;.    pFd->
28350 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
28360 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
28370 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
28380 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
28390 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d  memory mapping m
283a0 61 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c  aintained by fil
283b0 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  e .** descriptor
283c0 20 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74   pFd to nNew byt
283d0 65 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67  es. Any existing
283e0 20 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73 63   mapping is disc
283f0 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  arded..**.** If 
28400 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
28410 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74   function sets t
28420 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
28430 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  iables:.**.**   
28440 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61      unixFile.pMa
28450 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  pRegion.**      
28460 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69   unixFile.mmapSi
28470 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78  ze.**       unix
28480 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74  File.mmapSizeAct
28490 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73  ual.**.** If uns
284a0 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72  uccessful, an er
284b0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
284c0 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69 74 65  ogged via sqlite
284d0 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74  3_log() and.** t
284e0 68 65 20 74 68 72 65 65 20 76 61 72 69 61 62 6c  he three variabl
284f0 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72  es above are zer
28500 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  oed. In this cas
28510 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a  e SQLite should.
28520 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65  ** continue acce
28530 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
28540 73 65 20 75 73 69 6e 67 20 74 68 65 20 78 52 65  se using the xRe
28550 61 64 28 29 20 61 6e 64 20 78 57 72 69 74 65 28  ad() and xWrite(
28560 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  ).** methods..*/
28570 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
28580 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e  xRemapfile(.  un
28590 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20  ixFile *pFd,    
285a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
285b0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
285c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34   object */.  i64
285d0 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20 20   nNew           
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
285f0 52 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67  Required mapping
28600 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f   size */.){.  co
28610 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
28620 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68   "mmap";.  int h
28630 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20   = pFd->h;      
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
28660 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69  or open on db fi
28670 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69  le */.  u8 *pOri
28680 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70  g = (u8 *)pFd->p
28690 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20  MapRegion;   /* 
286a0 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
286b0 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20  nt file mapping 
286c0 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d  */.  i64 nOrig =
286d0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
286e0 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a  tual;     /* Siz
286f0 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f  e of pOrig regio
28700 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  n in bytes */.  
28710 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20  u8 *pNew = 0;   
28720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28730 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e       /* Location
28740 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20   of new mapping 
28750 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  */.  int flags =
28760 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20   PROT_READ;     
28770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
28780 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d  gs to pass to mm
28790 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ap() */..  asser
287a0 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
287b0 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
287c0 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70  ( nNew>pFd->mmap
287d0 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
287e0 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61  ( nNew<=pFd->mma
287f0 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73  pSizeMax );.  as
28800 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
28810 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d    assert( pFd->m
28820 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70  mapSizeActual>=p
28830 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a  Fd->mmapSize );.
28840 20 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41    assert( MAP_FA
28850 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69 66 64  ILED!=0 );..#ifd
28860 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52  ef SQLITE_MMAP_R
28870 45 41 44 57 52 49 54 45 0a 20 20 69 66 28 20 28  EADWRITE.  if( (
28880 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  pFd->ctrlFlags &
28890 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
288a0 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d 20  )==0 ) flags |= 
288b0 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65 6e 64  PROT_WRITE;.#end
288c0 69 66 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20  if..  if( pOrig 
288d0 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  ){.#if HAVE_MREM
288e0 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73  AP.    i64 nReus
288f0 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  e = pFd->mmapSiz
28900 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  e;.#else.    con
28910 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67 65  st int szSyspage
28920 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65   = osGetpagesize
28930 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75  ();.    i64 nReu
28940 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53  se = (pFd->mmapS
28950 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67  ize & ~(szSyspag
28960 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  e-1));.#endif.  
28970 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f    u8 *pReq = &pO
28980 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20  rig[nReuse];..  
28990 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70    /* Unmap any p
289a0 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69 73  ages of the exis
289b0 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61  ting mapping tha
289c0 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73  t cannot be reus
289d0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ed. */.    if( n
289e0 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a  Reuse!=nOrig ){.
289f0 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
28a00 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73  Req, nOrig-nReus
28a10 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48  e);.    }..#if H
28a20 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70  AVE_MREMAP.    p
28a30 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70  New = osMremap(p
28a40 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e  Orig, nReuse, nN
28a50 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f  ew, MREMAP_MAYMO
28a60 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20  VE);.    zErr = 
28a70 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a  "mremap";.#else.
28a80 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61      pNew = osMma
28a90 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65  p(pReq, nNew-nRe
28aa0 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f  use, flags, MAP_
28ab0 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73  SHARED, h, nReus
28ac0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
28ad0 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  !=MAP_FAILED ){.
28ae0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d        if( pNew!=
28af0 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  pReq ){.        
28b00 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e  osMunmap(pNew, n
28b10 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20  New - nReuse);. 
28b20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b         pNew = 0;
28b30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28b40 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72        pNew = pOr
28b50 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ig;.      }.    
28b60 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
28b70 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   The attempt to 
28b80 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73 74  extend the exist
28b90 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c  ing mapping fail
28ba0 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a  ed. Free it. */.
28bb0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41      if( pNew==MA
28bc0 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77  P_FAILED || pNew
28bd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d  ==0 ){.      osM
28be0 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65  unmap(pOrig, nRe
28bf0 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  use);.    }.  }.
28c00 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73  .  /* If pNew is
28c10 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79   still NULL, try
28c20 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6e   to create an en
28c30 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70 69  tirely new mappi
28c40 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  ng. */.  if( pNe
28c50 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  w==0 ){.    pNew
28c60 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65   = osMmap(0, nNe
28c70 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48  w, flags, MAP_SH
28c80 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d  ARED, h, 0);.  }
28c90 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41  ..  if( pNew==MA
28ca0 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
28cb0 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e  pNew = 0;.    nN
28cc0 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78  ew = 0;.    unix
28cd0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
28ce0 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a  OK, zErr, pFd->z
28cf0 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Path);..    /* I
28d00 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62 6f  f the mmap() abo
28d10 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d  ve failed, assum
28d20 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65  e that all subse
28d30 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c  quent mmap() cal
28d40 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70  ls.    ** will p
28d50 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f  robably fail too
28d60 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75  . Fall back to u
28d70 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
28d80 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20 20  e exclusively.  
28d90 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73    ** in this cas
28da0 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e  e.  */.    pFd->
28db0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b  mmapSizeMax = 0;
28dc0 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70  .  }.  pFd->pMap
28dd0 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a  Region = (void *
28de0 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d  )pNew;.  pFd->mm
28df0 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d  apSize = pFd->mm
28e00 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e  apSizeActual = n
28e10 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  New;.}../*.** Me
28e20 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61  mory map or rema
28e30 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  p the file opene
28e40 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69  d by file-descri
28e50 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65  ptor pFd (if the
28e60 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65   file.** is alre
28e70 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20  ady mapped, the 
28e80 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
28e90 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
28ea0 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66  the new). Or, if
28eb0 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61   .** there alrea
28ec0 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70  dy exists a mapp
28ed0 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ing for this fil
28ee0 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
28ef0 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74   still .** outst
28f00 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29 20  anding xFetch() 
28f10 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74  references to it
28f20 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
28f30 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
28f40 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
28f50 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  Byte is non-nega
28f60 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  tive, then it is
28f70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
28f80 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d  ize of .** the m
28f90 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65  apping to create
28fa0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
28fb0 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68  nByte is less th
28fc0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
28fd0 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
28fe0 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65  size is the size
28ff0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
29000 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c  disk. The actual
29010 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
29020 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20  created mapping 
29030 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65  is either the re
29040 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20  quested size or 
29050 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
29060 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53  ured .** using S
29070 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
29080 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76 65  _LIMIT, whicheve
29090 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a  r is smaller..**
290a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
290b0 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
290c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76  error occurs (ev
290d0 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e  en if the mappin
290e0 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72  g is not.** recr
290f0 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c  eated as a resul
29100 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  t of outstanding
29110 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20   references) or 
29120 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
29130 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
29140 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
29150 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69   unixMapfile(uni
29160 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20  xFile *pFd, i64 
29170 6e 4d 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28  nMap){.  assert(
29180 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d   nMap>=0 || pFd-
29190 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
291a0 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
291b0 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53  0 || (pFd->mmapS
291c0 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70  ize==0 && pFd->p
291d0 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b  MapRegion==0) );
291e0 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74  .  if( pFd->nFet
291f0 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e  chOut>0 ) return
29200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
29210 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20  f( nMap<0 ){.   
29220 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
29230 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 2f  tbuf;          /
29240 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
29250 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
29260 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
29270 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75 66  pFd->h, &statbuf
29280 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
29290 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
292a0 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  STAT;.    }.    
292b0 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73  nMap = statbuf.s
292c0 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  t_size;.  }.  if
292d0 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70  ( nMap>pFd->mmap
292e0 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e  SizeMax ){.    n
292f0 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  Map = pFd->mmapS
29300 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 61  izeMax;.  }..  a
29310 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c  ssert( nMap>0 ||
29320 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d   (pFd->mmapSize=
29330 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70 52  =0 && pFd->pMapR
29340 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69  egion==0) );.  i
29350 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d  f( nMap!=pFd->mm
29360 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 75 6e  apSize ){.    un
29370 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c  ixRemapfile(pFd,
29380 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20 72   nMap);.  }..  r
29390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
293a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
293b0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
293c0 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  E>0 */../*.** If
293d0 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72   possible, retur
293e0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
293f0 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65   mapping of file
29400 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20   fd starting at 
29410 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20  offset.** iOff. 
29420 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  The mapping must
29430 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74   be valid for at
29440 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65   least nAmt byte
29450 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  s..**.** If such
29460 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62   a pointer can b
29470 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72  e obtained, stor
29480 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20  e it in *pp and 
29490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
294a0 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20  ..** Or, if one 
294b0 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72  cannot but no er
294c0 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
294d0 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74  *pp to 0 and ret
294e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
294f0 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e  * Finally, if an
29500 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
29510 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  r, return an SQL
29520 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
29530 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c  The final.** val
29540 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64  ue of *pp is und
29550 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
29560 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
29570 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
29580 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
29590 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75  r, the caller mu
295a0 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a  st eventually .*
295b0 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65  * release the re
295c0 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69  ference by calli
295d0 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28 29  ng unixUnfetch()
295e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
295f0 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74 65  unixFetch(sqlite
29600 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
29610 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20  iOff, int nAmt, 
29620 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20  void **pp){.#if 
29630 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
29640 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c  SIZE>0.  unixFil
29650 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69  e *pFd = (unixFi
29660 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  le *)fd;   /* Th
29670 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
29680 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65  abase file */.#e
29690 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a  ndif.  *pp = 0;.
296a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
296b0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
296c0 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  ( pFd->mmapSizeM
296d0 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ax>0 ){.    if( 
296e0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d  pFd->pMapRegion=
296f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
29700 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65  rc = unixMapfile
29710 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20  (pFd, -1);.     
29720 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29730 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
29740 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
29750 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69  d->mmapSize >= i
29760 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20  Off+nAmt ){.    
29770 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29    *pp = &((u8 *)
29780 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
29790 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46  [iOff];.      pF
297a0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a  d->nFetchOut++;.
297b0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
297c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
297d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
297e0 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
297f0 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ent is non-NULL,
29800 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
29810 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a  ion releases a .
29820 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  ** reference obt
29830 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  ained by an earl
29840 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  ier call to unix
29850 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63  Fetch(). The sec
29860 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
29870 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
29880 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
29890 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
298a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
298b0 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77   argument that w
298c0 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  as passed to the
298d0 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e 76   unixFetch() inv
298e0 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  ocation. .**.** 
298f0 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  Or, if the third
29900 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c   argument is NUL
29910 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
29920 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
29930 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66  alled .** to inf
29940 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65  orm the VFS laye
29950 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e  r that, accordin
29960 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20  g to POSIX, any 
29970 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
29980 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20   .** may now be 
29990 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
299a0 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a  ld be unmapped..
299b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
299c0 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65  ixUnfetch(sqlite
299d0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
299e0 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a  iOff, void *p){.
299f0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
29a00 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69  MAP_SIZE>0.  uni
29a10 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e  xFile *pFd = (un
29a20 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f  ixFile *)fd;   /
29a30 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
29a40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
29a50 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
29a60 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f  ETER(iOff);..  /
29a70 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70  * If p==0 (unmap
29a80 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65   the entire file
29a90 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  ) then there mus
29aa0 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64  t be no outstand
29ab0 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68  ing .  ** xFetch
29ac0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c   references. Or,
29ad0 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e   if p!=0 (meanin
29ae0 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63  g it is an xFetc
29af0 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20  h reference),.  
29b00 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  ** then there mu
29b10 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
29b20 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20  ne outstanding. 
29b30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
29b40 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74  ==0)==(pFd->nFet
29b50 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20  chOut==0) );..  
29b60 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d  /* If p!=0, it m
29b70 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f  ust match the iO
29b80 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61  ff value. */.  a
29b90 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
29ba0 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  ==&((u8 *)pFd->p
29bb0 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
29bc0 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a   );..  if( p ){.
29bd0 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
29be0 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ut--;.  }else{. 
29bf0 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65     unixUnmapfile
29c00 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  (pFd);.  }..  as
29c10 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
29c20 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65  hOut>=0 );.#else
29c30 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29c40 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
29c50 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
29c60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
29c70 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66  ER(iOff);.#endif
29c80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29c90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  _OK;.}../*.** He
29ca0 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c  re ends the impl
29cb0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  ementation of al
29cc0 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  l sqlite3_file m
29cd0 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ethods..**.*****
29ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29cf0 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69  * End sqlite3_fi
29d00 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le Methods *****
29d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
29d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
29d80 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
29d90 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
29da0 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  ions of sqlite3_
29db0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
29dc0 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65  ts that.** imple
29dd0 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c  ment various fil
29de0 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  e locking strate
29df0 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63  gies.  It also c
29e00 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
29e10 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65  ons.** of "finde
29e20 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41  r" functions.  A
29e30 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
29e40 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61   is used to loca
29e50 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  te the appropria
29e60 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f  te.** sqlite3_io
29e70 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
29e80 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
29e90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
29ea0 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a   The pAppData.**
29eb0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71   field of the sq
29ec0 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62  lite3_vfs VFS ob
29ed0 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61  jects are initia
29ee0 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  lized to be poin
29ef0 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63  ters to.** the c
29f00 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75  orrect finder-fu
29f10 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20  nction for that 
29f20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  VFS..**.** Most 
29f30 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  finder functions
29f40 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
29f50 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c  r to a fixed sql
29f60 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
29f70 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20  ** object.  The 
29f80 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67  only interesting
29f90 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
29fa0 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69   is autolockIoFi
29fb0 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c  nder, which.** l
29fc0 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65  ooks at the file
29fd0 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20  system type and 
29fe0 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74  tries to guess t
29ff0 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a  he best locking.
2a000 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d  ** strategy from
2a010 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   that..**.** For
2a020 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
2a030 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20   F, two objects 
2a040 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a  are created:.**.
2a050 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65  **    (1) The re
2a060 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  al finder-functi
2a070 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28  on named "FImpt(
2a080 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  )"..**.**    (2)
2a090 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e   A constant poin
2a0a0 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ter to this func
2a0b0 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20  tion named just 
2a0c0 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20  "F"..**.**.** A 
2a0d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
2a0e0 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64   pointer is used
2a0f0 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61   as the pAppData
2a100 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a   value for VFS.*
2a110 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68  * objects.  We h
2a120 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69  ave to do this i
2a130 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e  nstead of lettin
2a140 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74  g pAppData point
2a150 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20  .** directly at 
2a160 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  the finder-funct
2a170 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75  ion since C90 ru
2a180 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f  les prevent a vo
2a190 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63  id*.** from be c
2a1a0 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74  ast into a funct
2a1b0 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ion pointer..**.
2a1c0 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61  **.** Each insta
2a1d0 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72  nce of this macr
2a1e0 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  o generates two 
2a1f0 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  objects:.**.**  
2a200 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73   *  A constant s
2a210 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a220 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45  s object call ME
2a230 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f  THOD that has lo
2a240 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65  cking.**      me
2a250 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43  thods CLOSE, LOC
2a260 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53  K, UNLOCK, CKRES
2a270 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  LOCK..**.**   * 
2a280 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66   An I/O method f
2a290 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63  inder function c
2a2a0 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61  alled FINDER tha
2a2b0 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  t returns a poin
2a2c0 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ter.**      to t
2a2d0 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74  he METHOD object
2a2e0 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
2a2f0 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66   bullet..*/.#def
2a300 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49  ine IOMETHODS(FI
2a310 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53  NDER,METHOD,VERS
2a320 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55  ION,CLOSE,LOCK,U
2a330 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d  NLOCK,CKLOCK,SHM
2a340 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61 74 69  MAP)     \.stati
2a350 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2a360 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f  io_methods METHO
2a370 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20  D = {           
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52          \.   VER
2a3a0 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20  SION,           
2a3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
2a3c0 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3e0 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53         \.   CLOS
2a3f0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
2a400 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
2a410 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
2a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a430 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52        \.   unixR
2a440 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
2a450 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
2a460 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a480 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72       \.   unixWr
2a490 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
2a4a0 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
2a4b0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4d0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75      \.   unixTru
2a4e0 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
2a4f0 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
2a500 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a520 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63     \.   unixSync
2a530 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a540 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20      /* xSync */ 
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a570 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53    \.   unixFileS
2a580 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
2a590 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
2a5a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5c0 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20   \.   LOCK,     
2a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5e0 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20    /* xLock */   
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a610 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20  \.   UNLOCK,    
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a630 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20   /* xUnlock */  
2a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2a660 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20  .   CKLOCK,     
2a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a680 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2a690 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  dLock */        
2a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2a6b0 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72     unixFileContr
2a6c0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
2a6d0 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
2a6e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2a700 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
2a710 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2a720 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20   xSectorSize */ 
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a740 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2a750 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
2a760 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20  cteristics,  /* 
2a770 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74  xDeviceCapabilit
2a780 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ies */          
2a790 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2a7a0 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20 20  SHMMAP,         
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a7c0 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20  ShmMap */       
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2a7f0 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  nixShmLock,     
2a800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2a810 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  hmLock */       
2a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a830 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2a840 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  ixShmBarrier,   
2a850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2a860 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20  mBarrier */     
2a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a880 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2a890 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20  xShmUnmap,      
2a8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2a8b0 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  Unmap */        
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8d0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2a8e0 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  Fetch,          
2a8f0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
2a900 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  h */            
2a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a920 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55        \.   unixU
2a930 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  nfetch,         
2a940 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74         /* xUnfet
2a950 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
2a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a970 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20       \.};       
2a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9c0 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
2a9d0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2a9e0 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49  thods *FINDER##I
2a9f0 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mpl(const char *
2aa00 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b  z, unixFile *p){
2aa10 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41     \.  UNUSED_PA
2aa20 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53  RAMETER(z); UNUS
2aa30 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
2aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa60 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45    \.  return &ME
2aa70 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20  THOD;           
2aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aab0 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20   \.}            
2aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab00 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
2ab10 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2ab20 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45  s *(*const FINDE
2ab30 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  R)(const char*,u
2ab40 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c  nixFile *p)    \
2ab50 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49  .    = FINDER##I
2ab60 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  mpl;../*.** Here
2ab70 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20   are all of the 
2ab80 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2ab90 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65  ds objects for e
2aba0 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ach of the.** lo
2abb0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
2abc0 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61  .  Functions tha
2abd0 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  t return pointer
2abe0 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f  s to these metho
2abf0 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63  ds.** are also c
2ac00 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54  reated..*/.IOMET
2ac10 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46  HODS(.  posixIoF
2ac20 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
2ac30 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
2ac40 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
2ac50 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20  osixIoMethods,  
2ac60 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2ac70 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2ac80 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
2ac90 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
2aca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
2acb0 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d  red memory and m
2acc0 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20  map are enabled 
2acd0 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2acf0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2ad00 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
2ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ad20 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2ad30 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20  /.  unixUnlock, 
2ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ad50 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2ad60 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
2ad70 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f  servedLock,    /
2ad80 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2ad90 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2ada0 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20   unixShmMap     
2adb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2adc0 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
2add0 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  ).IOMETHODS(.  n
2ade0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  olockIoFinder,  
2adf0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
2ae00 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
2ae10 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65   */.  nolockIoMe
2ae20 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2ae30 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
2ae40 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
2ae50 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20  e */.  3,       
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae70 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
2ae80 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
2ae90 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  .  nolockClose, 
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aeb0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
2aec0 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  .  nolockLock,  
2aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aee0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
2aef0 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20    nolockUnlock, 
2af00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2af10 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
2af20 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  .  nolockCheckRe
2af30 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20  servedLock,  /* 
2af40 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2af50 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
2af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2af80 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
2af90 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74  IOMETHODS(.  dot
2afa0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
2afb0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2afc0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2afd0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  /.  dotlockIoMet
2afe0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  hods,         /*
2aff0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2b000 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2b010 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b030 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2b040 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
2b050 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20   dotlockClose,  
2b060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2b070 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2b080 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20   dotlockLock,   
2b090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2b0a0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2b0b0 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20  dotlockUnlock,  
2b0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2b0d0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2b0e0 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73   dotlockCheckRes
2b0f0 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43  ervedLock, /* xC
2b100 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2b110 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b130 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
2b140 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23  p method */.)..#
2b150 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2b160 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
2b170 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63  OMETHODS(.  floc
2b180 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
2b190 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2b1a0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2b1b0 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  .  flockIoMethod
2b1c0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2b1d0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2b1e0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2b1f0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b210 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2b220 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2b230 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  flockClose,     
2b240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2b250 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2b260 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  flockLock,      
2b270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2b280 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
2b290 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
2b2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2b2b0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2b2c0 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
2b2d0 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68  edLock,   /* xCh
2b2e0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2b2f0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
2b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b310 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2b320 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2b330 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dif..#if OS_VXWO
2b340 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
2b350 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20   semIoFinder,   
2b360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2b370 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2b380 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74  me */.  semIoMet
2b390 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
2b3a0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
2b3b0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
2b3c0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3e0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2b3f0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2b400 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20  */.  semXClose, 
2b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b420 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2b430 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20  */.  semXLock,  
2b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b450 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2b460 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20  /.  semXUnlock, 
2b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b480 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2b490 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52 65  */.  semXCheckRe
2b4a0 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f  servedLock,    /
2b4b0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2b4c0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2b4d0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
2b4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2b4f0 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
2b500 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
2b510 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2b520 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2b530 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2b540 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70  IOMETHODS(.  afp
2b550 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2b560 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2b570 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2b580 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73  /.  afpIoMethods
2b590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2b5a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2b5b0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2b5c0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b5e0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2b5f0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
2b600 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20   afpClose,      
2b610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2b620 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2b630 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20   afpLock,       
2b640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2b650 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2b660 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  afpUnlock,      
2b670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2b680 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2b690 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
2b6a0 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43  dLock,     /* xC
2b6b0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2b6c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
2b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6e0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
2b6f0 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
2b700 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
2b710 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65  proxy locking me
2b720 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72  thod is a "super
2b730 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20  -method" in the 
2b740 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a  sense that it.**
2b750 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79   opens secondary
2b760 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2b770 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  s for the conch 
2b780 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  and lock files a
2b790 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72  nd.** it uses pr
2b7a0 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41  oxy, dot-file, A
2b7b0 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20  FP, and flock() 
2b7c0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
2b7d0 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f  on those.** seco
2b7e0 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f  ndary files.  Fo
2b7f0 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  r this reason, t
2b800 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
2b810 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70   implements.** p
2b820 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2b830 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72  located much fur
2b840 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65  ther down in the
2b850 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e   file.  But we n
2b860 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65  eed.** to go ahe
2b870 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68  ad and define th
2b880 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
2b890 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20  hods and finder 
2b8a0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
2b8b0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65  proxy locking he
2b8c0 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61  re.  So we forwa
2b8d0 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49  rd declare the I
2b8e0 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23  /O methods..*/.#
2b8f0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2b900 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2b910 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2b920 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20  TYLE.static int 
2b930 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74  proxyClose(sqlit
2b940 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69  e3_file*);.stati
2b950 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28  c int proxyLock(
2b960 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
2b970 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
2b980 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69  proxyUnlock(sqli
2b990 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
2b9a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2b9b0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
2b9c0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
2b9d0 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f  , int*);.IOMETHO
2b9e0 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e  DS(.  proxyIoFin
2b9f0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
2ba00 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
2ba10 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f  on name */.  pro
2ba20 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  xyIoMethods,    
2ba30 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2ba40 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
2ba50 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
2ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba70 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
2ba80 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
2ba90 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43  bled */.  proxyC
2baa0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2bab0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
2bac0 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c  thod */.  proxyL
2bad0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2bae0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
2baf0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e  hod */.  proxyUn
2bb00 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2bb10 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
2bb20 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43  thod */.  proxyC
2bb30 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2bb40 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ,   /* xCheckRes
2bb50 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
2bb60 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb80 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
2bb90 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
2bba0 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f  * nfs lockd on O
2bbb0 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74  SX 10.3+ doesn't
2bbc0 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63   clear write loc
2bbd0 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  ks when a read l
2bbe0 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69  ock is set */.#i
2bbf0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2bc00 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2bc10 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2bc20 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
2bc30 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20   nfsIoFinder,   
2bc40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2bc50 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2bc60 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65  ame */.  nfsIoMe
2bc70 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2bc80 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2bc90 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2bca0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcc0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2bcd0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2bce0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
2bcf0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2bd00 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2bd10 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
2bd20 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2bd30 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
2bd40 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f  hod */.  nfsUnlo
2bd50 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2bd60 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2bd70 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
2bd80 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2bd90 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ,     /* xCheckR
2bda0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
2bdb0 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdd0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2bde0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2bdf0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
2be00 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2be10 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2be20 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
2be30 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
2be40 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
2be50 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
2be60 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
2be70 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
2be80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2be90 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
2bea0 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
2beb0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2bec0 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
2bed0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
2bee0 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
2bef0 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d  ** This is for M
2bf00 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  acOSX only..*/.s
2bf10 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2bf20 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2bf30 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2bf40 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
2bf50 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
2bf60 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
2bf70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2bf80 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2bf90 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  w           /* o
2bfa0 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
2bfb0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
2bfc0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74   file */.){.  st
2bfd0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2bfe0 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20  t Mapping {.    
2bff0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2c000 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20  esystem;        
2c010 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73        /* Filesys
2c020 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f  tem type name */
2c030 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
2c040 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
2c050 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70  Methods;   /* Ap
2c060 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
2c070 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20  g method */.  } 
2c080 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aMap[] = {.    {
2c090 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "hfs",    &posi
2c0a0 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
2c0b0 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70    { "ufs",    &p
2c0c0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
2c0d0 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20  .    { "afpfs", 
2c0e0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
2c0f0 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c  ,.    { "smbfs",
2c100 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
2c110 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76  },.    { "webdav
2c120 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  ", &nolockIoMeth
2c130 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20  ods },.    { 0, 
2c140 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  0 }.  };.  int i
2c150 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
2c160 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75  s fsInfo;.  stru
2c170 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
2c180 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
2c190 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
2c1a0 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
2c1b0 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
2c1c0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2c1d0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
2c1e0 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
2c1f0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2c200 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
2c210 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2c220 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66  ethods;.  }.  if
2c230 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74  ( statfs(filePat
2c240 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
2c250 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49  1 ){.    if( fsI
2c260 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e  nfo.f_flags & MN
2c270 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  T_RDONLY ){.    
2c280 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
2c290 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2c2a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d  .    for(i=0; aM
2c2b0 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
2c2c0 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
2c2d0 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
2c2e0 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61  .f_fstypename, a
2c2f0 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
2c300 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  em)==0 ){.      
2c310 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d    return aMap[i]
2c320 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20  .pMethods;.     
2c330 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2c340 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e  /* Default case.
2c350 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73   Handles, amongs
2c360 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e  t others, "nfs".
2c370 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d  .  ** Test byte-
2c380 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
2c390 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65   fcntl(). If the
2c3a0 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20   call succeeds, 
2c3b0 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
2c3c0 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
2c3d0 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58  m supports POSIX
2c3e0 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20   style locks. . 
2c3f0 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
2c400 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
2c410 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
2c420 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
2c430 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
2c440 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
2c450 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
2c460 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
2c470 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
2c480 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
2c490 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
2c4a0 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
2c4b0 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20  name, "nfs")==0 
2c4c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2c4d0 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &nfsIoMethods;. 
2c4e0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2c4f0 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
2c500 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
2c510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2c520 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65  urn &dotlockIoMe
2c530 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
2c540 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2c550 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
2c560 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
2c570 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
2c580 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2c590 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
2c5a0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
2c5b0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
2c5c0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2c5d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2c5e0 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
2c5f0 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20  S_VXWORKS./*.** 
2c600 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
2c610 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72  nction for VxWor
2c620 6b 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ks checks to see
2c630 20 69 66 20 70 6f 73 69 78 20 61 64 76 69 73 6f   if posix adviso
2c640 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f  ry.** locking wo
2c650 72 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73  rks.  If it does
2c660 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 77  , then that is w
2c670 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 49 66  hat is used.  If
2c680 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20   it does not.** 
2c690 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62  work, then fallb
2c6a0 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d  ack to named sem
2c6b0 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a  aphore locking..
2c6c0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2c6d0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2c6e0 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e  ds *vxworksIoFin
2c6f0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
2c700 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
2c710 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
2c720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c730 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2c740 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
2c750 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
2c760 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
2c770 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
2c780 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
2c790 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
2c7a0 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
2c7b0 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
2c7c0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2c7d0 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
2c7e0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
2c7f0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2c800 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
2c810 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
2c820 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
2c830 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
2c840 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
2c850 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
2c860 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
2c870 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
2c880 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
2c890 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
2c8a0 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
2c8b0 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
2c8c0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
2c8d0 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
2c8e0 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
2c8f0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
2c900 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
2c910 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
2c920 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
2c930 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
2c940 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
2c950 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
2c960 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
2c970 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
2c980 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
2c990 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2c9a0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
2c9b0 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73  *(*const vxworks
2c9c0 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
2c9d0 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
2c9e0 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64   = vxworksIoFind
2c9f0 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
2ca00 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
2ca10 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72  ../*.** An abstr
2ca20 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70  act type for a p
2ca30 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f 20  ointer to an IO 
2ca40 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
2ca50 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
2ca60 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
2ca70 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
2ca80 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
2ca90 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2caa0 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
2cab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2caf0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
2cb00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cb10 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
2cb20 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
2cb30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cb40 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
2cb50 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
2cb60 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2cb70 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
2cb80 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
2cb90 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
2cba0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2cbb0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2cbc0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
2cbd0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
2cbe0 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
2cbf0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
2cc00 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
2cc10 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2cc20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2cc30 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
2cc40 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
2cc50 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2cc60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2cc70 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
2cc80 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
2cc90 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20  3_file *pId,    
2cca0 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
2ccb0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
2ccc0 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2ccd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2cce0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
2ccf0 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
2cd00 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
2cd10 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20   ctrlFlags      
2cd20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
2cd30 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20  more UNIXFILE_* 
2cd40 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63  values */.){.  c
2cd50 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2cd60 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e  methods *pLockin
2cd70 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
2cd80 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
2cd90 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
2cda0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2cdb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
2cdc0 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20  w->pInode==NULL 
2cdd0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b  );..  /* No lock
2cde0 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65  ing occurs in te
2cdf0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f  mporary files */
2ce00 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
2ce10 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c  name!=0 || (ctrl
2ce20 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2ce30 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a  _NOLOCK)!=0 );..
2ce40 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
2ce50 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20      %-3d %s\n", 
2ce60 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  h, zFilename));.
2ce70 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20    pNew->h = h;. 
2ce80 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56   pNew->pVfs = pV
2ce90 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74  fs;.  pNew->zPat
2cea0 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
2ceb0 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2cec0 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73   = (u8)ctrlFlags
2ced0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
2cee0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70  _MMAP_SIZE>0.  p
2cef0 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  New->mmapSizeMax
2cf00 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
2cf10 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23  Config.szMmap;.#
2cf20 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
2cf30 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2cf40 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ((ctrlFlags & UN
2cf50 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46  IXFILE_URI) ? zF
2cf60 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20  ilename : 0),.  
2cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf80 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c           "psow",
2cf90 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
2cfa0 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
2cfb0 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2cfc0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2cfd0 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  PSOW;.  }.  if( 
2cfe0 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61  strcmp(pVfs->zNa
2cff0 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d  me,"unix-excl")=
2d000 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 ){.    pNew->
2d010 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2d020 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a  XFILE_EXCL;.  }.
2d030 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2d040 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78    pNew->pId = vx
2d050 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
2d060 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
2d070 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29  ( pNew->pId==0 )
2d080 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20  {.    ctrlFlags 
2d090 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  |= UNIXFILE_NOLO
2d0a0 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  CK;.    rc = SQL
2d0b0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2d0c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
2d0d0 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ( ctrlFlags & UN
2d0e0 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b  IXFILE_NOLOCK ){
2d0f0 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
2d100 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  le = &nolockIoMe
2d110 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
2d120 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
2d130 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74  e = (**(finder_t
2d140 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44  ype*)pVfs->pAppD
2d150 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  ata)(zFilename, 
2d160 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54  pNew);.#if SQLIT
2d170 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2d180 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61  _STYLE.    /* Ca
2d190 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e  che zFilename in
2d1a0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
2d1b0 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f  text (AFP and do
2d1c0 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20  tlock override) 
2d1d0 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79  for.    ** proxy
2d1e0 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20  Lock activation 
2d1f0 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d  is possible (rem
2d200 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73  ote proxy is bas
2d210 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20  ed on db name). 
2d220 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     ** zFilename 
2d230 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
2d240 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  til file is clos
2d250 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a  ed, to support *
2d260 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  /.    pNew->lock
2d270 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f  ingContext = (vo
2d280 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23  id*)zFilename;.#
2d290 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
2d2a0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2d2b0 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  = &posixIoMethod
2d2c0 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  s.#if defined(__
2d2d0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2d2e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2d2f0 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70  G_STYLE.    || p
2d300 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2d310 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65  &nfsIoMethods.#e
2d320 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e  ndif.  ){.    un
2d330 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2d340 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2d350 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2d360 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2d370 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d380 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
2d390 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2d3a0 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65  red in findInode
2d3b0 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68  Info(), close th
2d3c0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2d3d0 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64  r.      ** immed
2d3e0 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72  iately, before r
2d3f0 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74  eleasing the mut
2d400 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  ex. findInodeInf
2d410 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20  o() may fail.   
2d420 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65     ** in two sce
2d430 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a  narios:.      **
2d440 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20  .      **   (a) 
2d450 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28  A call to fstat(
2d460 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  ) failed..      
2d470 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f  **   (b) A mallo
2d480 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  c failed..      
2d490 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e  **.      ** Scen
2d4a0 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c  ario (b) may onl
2d4b0 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70  y occur if the p
2d4c0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
2d4d0 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20  g no other.     
2d4e0 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
2d4f0 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  tors open on the
2d500 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74   same file. If t
2d510 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20  here were other 
2d520 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
2d530 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69  scriptors on thi
2d540 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  s file, then no 
2d550 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20  malloc would be 
2d560 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
2d570 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e    ** findInodeIn
2d580 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73  fo(). If this is
2d590 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73   the case, it is
2d5a0 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63   quite safe to c
2d5b0 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  lose.      ** ha
2d5c0 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69  ndle h - as it i
2d5d0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
2d5e0 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73  t no posix locks
2d5f0 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65   will be release
2d600 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f  d.      ** by do
2d610 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a  ing so..      **
2d620 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65  .      ** If sce
2d630 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64  nario (a) caused
2d640 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20   the error then 
2d650 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73  things are not s
2d660 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20  o safe. The.    
2d670 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73    ** implicit as
2d680 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73  sumption here is
2d690 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29   that if fstat()
2d6a0 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61   fails, things a
2d6b0 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73  re in.      ** s
2d6c0 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68  uch bad shape th
2d6d0 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f  at dropping a lo
2d6e0 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27  ck or two doesn'
2d6f0 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20  t matter much.. 
2d700 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f       */.      ro
2d710 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2d720 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2d730 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
2d740 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2d750 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69  Mutex();.  }..#i
2d760 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2d770 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
2d780 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2d790 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70  __).  else if( p
2d7a0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2d7b0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
2d7c0 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b  .    /* AFP lock
2d7d0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2d7e0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2d7f0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
2d800 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
2d810 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
2d820 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66  t..    */.    af
2d830 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
2d840 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d  *pCtx;.    pNew-
2d850 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
2d860 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33  = pCtx = sqlite3
2d870 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f  _malloc64( sizeo
2d880 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
2d890 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
2d8a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d8b0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2d8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2d8d0 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65   NB: zFilename e
2d8e0 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e  xists and remain
2d8f0 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68  s valid until th
2d900 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  e file is closed
2d910 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64  .      ** accord
2d920 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65  ing to requireme
2d930 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77  nt F11141.  So w
2d940 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
2d950 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a   make a.      **
2d960 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c   copy of the fil
2d970 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20  ename. */.      
2d980 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a  pCtx->dbPath = z
2d990 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
2d9a0 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d  pCtx->reserved =
2d9b0 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f   0;.      srando
2d9c0 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e  mdev();.      un
2d9d0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2d9e0 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49        rc = findI
2d9f0 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2da00 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2da10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2da20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2da30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2da40 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2da50 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f  ext);.        ro
2da60 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2da70 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2da80 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20         h = -1;. 
2da90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69       }.      uni
2daa0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20  xLeaveMutex();  
2dab0 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d        .    }.  }
2dac0 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20  .#endif..  else 
2dad0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2dae0 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  e == &dotlockIoM
2daf0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
2db00 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
2db10 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
2db20 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
2db30 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
2db40 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74  n.    ** the dot
2db50 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
2db60 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  xt .    */.    c
2db70 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  har *zLockFile;.
2db80 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
2db90 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  e;.    assert( z
2dba0 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20  Filename!=0 );. 
2dbb0 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28     nFilename = (
2dbc0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
2dbd0 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a  name) + 6;.    z
2dbe0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
2dbf0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
2dc00 63 36 34 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  c64(nFilename);.
2dc10 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c      if( zLockFil
2dc20 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
2dc30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2dc40 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
2dc50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2dc60 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
2dc70 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
2dc80 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
2dc90 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
2dca0 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
2dcb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2dcc0 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
2dcd0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2dce0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2dcf0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
2dd00 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2dd10 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
2dd20 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
2dd30 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
2dd40 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
2dd50 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
2dd60 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
2dd70 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
2dd80 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2dd90 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
2dda0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2ddb0 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2ddc0 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d  );.    if( (rc==
2ddd0 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70  SQLITE_OK) && (p
2dde0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2ddf0 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  m==NULL) ){.    
2de00 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65    char *zSemName
2de10 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d   = pNew->pInode-
2de20 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20  >aSemName;.     
2de30 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71   int n;.      sq
2de40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2de50 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65  AX_PATHNAME, zSe
2de60 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22  mName, "/%s.sem"
2de70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2de80 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
2de90 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
2dea0 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  me);.      for( 
2deb0 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  n=1; zSemName[n]
2dec0 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20  ; n++ ).        
2ded0 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d  if( zSemName[n]=
2dee0 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b  ='/' ) zSemName[
2def0 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  n] = '_';.      
2df00 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2df10 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
2df20 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
2df30 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
2df40 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64   if( pNew->pInod
2df50 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46  e->pSem == SEM_F
2df60 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
2df70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2df80 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
2df90 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
2dfa0 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30  SemName[0] = '\0
2dfb0 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
2dfc0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
2dfd0 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
2dfe0 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61 73 74  f.  .  storeLast
2dff0 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b 0a  Errno(pNew, 0);.
2e000 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2e010 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e020 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
2e030 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
2e040 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
2e050 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31  E__);.    h = -1
2e060 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a  ;.    osUnlink(z
2e070 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70  Filename);.    p
2e080 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
2e090 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  = UNIXFILE_DELET
2e0a0 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  E;.  }.#endif.  
2e0b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e0c0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d  K ){.    if( h>=
2e0d0 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  0 ) robust_close
2e0e0 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2e0f0 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  __);.  }else{.  
2e100 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
2e110 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  = pLockingStyle;
2e120 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
2e130 28 2b 31 29 3b 0a 20 20 20 20 76 65 72 69 66 79  (+1);.    verify
2e140 44 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20 20  DbFile(pNew);.  
2e150 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2e160 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2e170 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  he name of a dir
2e180 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20  ectory in which 
2e190 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79  to put temporary
2e1a0 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f   files..** If no
2e1b0 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72   suitable tempor
2e1c0 61 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f  ary file directo
2e1d0 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ry can be found,
2e1e0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
2e1f0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2e200 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65  ar *unixTempFile
2e210 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  Dir(void){.  sta
2e220 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2e230 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
2e240 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20    0,.     0,.   
2e250 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
2e260 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
2e270 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
2e280 20 22 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73 69   ".".  };.  unsi
2e290 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b 0a  gned int i = 0;.
2e2a0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
2e2b0 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  f;.  const char 
2e2c0 2a 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f  *zDir = sqlite3_
2e2d0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
2e2e0 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30  .  if( !azDirs[0
2e2f0 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ] ) azDirs[0] = 
2e300 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54  getenv("SQLITE_T
2e310 4d 50 44 49 52 22 29 3b 0a 20 20 69 66 28 20 21  MPDIR");.  if( !
2e320 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69  azDirs[1] ) azDi
2e330 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
2e340 54 4d 50 44 49 52 22 29 3b 0a 20 20 77 68 69 6c  TMPDIR");.  whil
2e350 65 28 31 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  e(1){.    if( zD
2e360 69 72 21 3d 30 0a 20 20 20 20 20 26 26 20 6f 73  ir!=0.     && os
2e370 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29  Stat(zDir, &buf)
2e380 3d 3d 30 0a 20 20 20 20 20 26 26 20 53 5f 49 53  ==0.     && S_IS
2e390 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
2e3a0 0a 20 20 20 20 20 26 26 20 6f 73 41 63 63 65 73  .     && osAcces
2e3b0 73 28 7a 44 69 72 2c 20 30 33 29 3d 3d 30 0a 20  s(zDir, 03)==0. 
2e3c0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
2e3d0 72 6e 20 7a 44 69 72 3b 0a 20 20 20 20 7d 0a 20  rn zDir;.    }. 
2e3e0 20 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66     if( i>=sizeof
2e3f0 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
2e400 61 7a 44 69 72 73 5b 30 5d 29 20 29 20 62 72 65  azDirs[0]) ) bre
2e410 61 6b 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61  ak;.    zDir = a
2e420 7a 44 69 72 73 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a  zDirs[i++];.  }.
2e430 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2e440 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
2e450 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
2e460 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
2e470 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
2e480 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  ed.** by the cal
2e490 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64  ling process and
2e4a0 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
2e4b0 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c  ugh to hold at l
2e4c0 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78  east.** pVfs->mx
2e4d0 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a  Pathname bytes..
2e4e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2e4f0 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  ixGetTempname(in
2e500 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2e510 75 66 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  uf){.  const cha
2e520 72 20 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20 69  r *zDir;.  int i
2e530 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Limit = 0;..  /*
2e540 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
2e550 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
2e560 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
2e570 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
2e580 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
2e590 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
2e5a0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
2e5b0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
2e5c0 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
2e5d0 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
2e5e0 20 20 2a 2f 0a 20 20 7a 42 75 66 5b 30 5d 20 3d    */.  zBuf[0] =
2e5f0 20 30 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   0;.  SimulateIO
2e600 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
2e610 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
2e620 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70   zDir = unixTemp
2e630 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28  FileDir();.  if(
2e640 20 7a 44 69 72 3d 3d 30 20 29 20 72 65 74 75 72   zDir==0 ) retur
2e650 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  n SQLITE_IOERR_G
2e660 45 54 54 45 4d 50 50 41 54 48 3b 0a 20 20 64 6f  ETTEMPPATH;.  do
2e670 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
2e680 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
2e690 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26  ess(sizeof(r), &
2e6a0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
2e6b0 6e 42 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a 42  nBuf>2 );.    zB
2e6c0 75 66 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b 0a  uf[nBuf-2] = 0;.
2e6d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2e6e0 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
2e6f0 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d   "%s/"SQLITE_TEM
2e700 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 22 25 6c  P_FILE_PREFIX"%l
2e710 6c 78 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  lx%c",.         
2e720 20 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72              zDir
2e730 2c 20 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , r, 0);.    if(
2e740 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d 30   zBuf[nBuf-2]!=0
2e750 20 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e 31   || (iLimit++)>1
2e760 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2e770 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69 6c  E_ERROR;.  }whil
2e780 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66  e( osAccess(zBuf
2e790 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ,0)==0 );.  retu
2e7a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2e7b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2e7c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2e7d0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
2e7e0 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75  PLE__)./*.** Rou
2e7f0 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72  tine to transfor
2e800 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74  m a unixFile int
2e810 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  o a proxy-lockin
2e820 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49  g unixFile..** I
2e830 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
2e840 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20   the proxy-lock 
2e850 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73  division, but us
2e860 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
2e870 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52  .** if SQLITE_PR
2e880 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
2e890 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  NG is defined..*
2e8a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2e8b0 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
2e8c0 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63  ile(unixFile*, c
2e8d0 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e  onst char*);.#en
2e8e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  dif../*.** Searc
2e8f0 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20  h for an unused 
2e900 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e910 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20  that was opened 
2e920 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2e930 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  .** file (not a 
2e940 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65  journal or maste
2e950 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r-journal file) 
2e960 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
2e970 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20  thname.** zPath 
2e980 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e  with SQLITE_OPEN
2e990 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68  _XXX flags match
2e9a0 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64  ing those passed
2e9b0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   as the second.*
2e9c0 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * argument to th
2e9d0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
2e9e0 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64  ** Such a file d
2e9f0 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78  escriptor may ex
2ea00 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73  ist if a databas
2ea10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
2ea20 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74   closed.** but t
2ea30 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
2ea40 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f  le descriptor co
2ea50 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  uld not be close
2ea60 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a  d because some.*
2ea70 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  * other file des
2ea80 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
2ea90 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73  the same file is
2eaa0 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d   holding a file-
2eab0 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74  lock..** Refer t
2eac0 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  o comments in th
2ead0 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75  e unixClose() fu
2eae0 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c  nction and the l
2eaf0 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a  engthy comment.*
2eb00 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f  * describing "Po
2eb10 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63  six Advisory Loc
2eb20 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61  king" at the sta
2eb30 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  rt of this file 
2eb40 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20  for .** further 
2eb50 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74  details. Also, t
2eb60 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a  icket #4018..**.
2eb70 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65  ** If a suitable
2eb80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2eb90 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   is found, then 
2eba0 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
2ebb0 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69  If no.** such fi
2ebc0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
2ebd0 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20   located, -1 is 
2ebe0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
2ebf0 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64  tic UnixUnusedFd
2ec00 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64   *findReusableFd
2ec10 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61  (const char *zPa
2ec20 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  th, int flags){.
2ec30 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2ec40 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  pUnused = 0;..  
2ec50 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68  /* Do not search
2ec60 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
2ec70 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2ec80 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62  n vxworks. Not b
2ec90 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f  ecause.  ** vxwo
2eca0 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65  rks would not be
2ecb0 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63  nefit from the c
2ecc0 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c  hange (it might,
2ecd0 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29   we're not sure)
2ece0 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75  ,.  ** but becau
2ecf0 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73  se no way to tes
2ed00 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  t it is currentl
2ed10 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20  y available. It 
2ed20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20  is better .  ** 
2ed30 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61  not to risk brea
2ed40 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70  king vxworks sup
2ed50 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b  port for the sak
2ed60 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73  e of such an obs
2ed70 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75  cure .  ** featu
2ed80 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f  re.  */.#if !OS_
2ed90 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
2eda0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
2edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2edc0 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61  * Results of sta
2edd0 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 75  t() call */..  u
2ede0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2edf0 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20  ..  /* A stat() 
2ee00 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f  call may fail fo
2ee10 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e  r various reason
2ee20 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  s. If this happe
2ee30 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61  ns, it is.  ** a
2ee40 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68  lmost certain th
2ee50 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c  at an open() cal
2ee60 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  l on the same pa
2ee70 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69  th will also fai
2ee80 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73  l..  ** For this
2ee90 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65   reason, if an e
2eea0 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
2eeb0 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68  he stat() call h
2eec0 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ere, it is.  ** 
2eed0 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69  ignored and -1 i
2eee0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  s returned. The 
2eef0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20  caller will try 
2ef00 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
2ef10 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
2ef20 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  or on the same p
2ef30 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72  ath, fail, and r
2ef40 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74  eturn an error t
2ef50 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20  o SQLite..  **. 
2ef60 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75   ** Even if a su
2ef70 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20  bsequent open() 
2ef80 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65  call does succee
2ef90 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e  d, the consequen
2efa0 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20  ces of.  ** not 
2efb0 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20  searching for a 
2efc0 72 65 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65  reusable file de
2efd0 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74  scriptor are not
2efe0 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28   dire.  */.  if(
2eff0 20 6e 55 6e 75 73 65 64 46 64 3e 30 20 26 26 20   nUnusedFd>0 && 
2f000 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
2f010 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2f020 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
2f030 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 70 49 6e 6f  Inode;..    pIno
2f040 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
2f050 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64      while( pInod
2f060 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69  e && (pInode->fi
2f070 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e  leId.dev!=sStat.
2f080 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20  st_dev.         
2f090 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
2f0a0 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e  Inode->fileId.in
2f0b0 6f 21 3d 28 75 36 34 29 73 53 74 61 74 2e 73 74  o!=(u64)sStat.st
2f0c0 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  _ino) ){.       
2f0d0 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
2f0e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
2f0f0 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a    if( pInode ){.
2f100 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64        UnixUnused
2f110 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66  Fd **pp;.      f
2f120 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70  or(pp=&pInode->p
2f130 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28  Unused; *pp && (
2f140 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61  *pp)->flags!=fla
2f150 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  gs; pp=&((*pp)->
2f160 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70  pNext));.      p
2f170 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20  Unused = *pp;.  
2f180 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
2f190 29 7b 0a 20 20 20 20 20 20 20 20 6e 55 6e 75 73  ){.        nUnus
2f1a0 65 64 46 64 2d 2d 3b 0a 20 20 20 20 20 20 20 20  edFd--;.        
2f1b0 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70  *pp = pUnused->p
2f1c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
2f1d0 20 20 7d 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65    }.  }.  unixLe
2f1e0 61 76 65 4d 75 74 65 78 28 29 3b 0a 23 65 6e 64  aveMutex();.#end
2f1f0 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f  if    /* if !OS_
2f200 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74  VXWORKS */.  ret
2f210 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a  urn pUnused;.}..
2f220 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6d  /*.** Find the m
2f230 6f 64 65 2c 20 75 69 64 20 61 6e 64 20 67 69 64  ode, uid and gid
2f240 20 6f 66 20 66 69 6c 65 20 7a 46 69 6c 65 2e 20   of file zFile. 
2f250 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
2f260 65 74 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f  etFileMode(.  co
2f270 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c  nst char *zFile,
2f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f290 20 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   File name */.  
2f2a0 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20  mode_t *pMode,  
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2c0 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69  /* OUT: Permissi
2f2d0 6f 6e 73 20 6f 66 20 7a 46 69 6c 65 20 2a 2f 0a  ons of zFile */.
2f2e0 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20    uid_t *pUid,  
2f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f300 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 6f 66    /* OUT: uid of
2f310 20 7a 46 69 6c 65 2e 20 2a 2f 0a 20 20 67 69 64   zFile. */.  gid
2f320 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20  _t *pGid        
2f330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f340 4f 55 54 3a 20 67 69 64 20 6f 66 20 7a 46 69 6c  OUT: gid of zFil
2f350 65 2e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  e. */.){.  struc
2f360 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
2f370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2f380 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f  tput of stat() o
2f390 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2f3a0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2f3b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 30  LITE_OK;.  if( 0
2f3c0 3d 3d 6f 73 53 74 61 74 28 7a 46 69 6c 65 2c 20  ==osStat(zFile, 
2f3d0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 2a  &sStat) ){.    *
2f3e0 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74  pMode = sStat.st
2f3f0 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20  _mode & 0777;.  
2f400 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e    *pUid = sStat.
2f410 73 74 5f 75 69 64 3b 0a 20 20 20 20 2a 70 47 69  st_uid;.    *pGi
2f420 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64  d = sStat.st_gid
2f430 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2f440 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2f450 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 72 65  _FSTAT;.  }.  re
2f460 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2f470 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2f480 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69  is called by uni
2f490 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72  xOpen() to deter
2f4a0 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65  mine the unix pe
2f4b0 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20  rmissions.** to 
2f4c0 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73  create new files
2f4d0 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72   with. If no err
2f4e0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
2f4f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2f500 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76  urned.** and a v
2f510 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f  alue suitable fo
2f520 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68 65  r passing as the
2f530 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
2f540 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a  to open(2) is.**
2f550 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f   written to *pMo
2f560 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  de. If an IO err
2f570 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
2f580 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
2f590 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
2f5a0 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
2f5b0 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d   *pMode is not m
2f5c0 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  odified..**.** I
2f5d0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 74 68  n most cases, th
2f5e0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
2f5f0 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69  *pMode to 0, whi
2f600 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a  ch will become.*
2f610 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20  * an indication 
2f620 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29  to robust_open()
2f630 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 66   to create the f
2f640 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c  ile using.** SQL
2f650 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2f660 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a  _PERMISSIONS adj
2f670 75 73 74 65 64 20 62 79 20 74 68 65 20 75 6d 61  usted by the uma
2f680 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  sk..** But if th
2f690 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
2f6a0 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20  ned is a WAL or 
2f6b0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
2f6c0 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  file, then .** t
2f6d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65  his function que
2f6e0 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79  ries the file-sy
2f6f0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72  stem for the per
2f700 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
2f710 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
2f720 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
2f730 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  and sets *pMode 
2f740 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  to this value. W
2f750 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73  henever .** poss
2f760 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f  ible, WAL and jo
2f770 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20  urnal files are 
2f780 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
2f790 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
2f7a0 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73  ns .** as the as
2f7b0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
2f7c0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
2f7d0 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
2f7e0 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74  LE_8_3_NAMES opt
2f7f0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
2f800 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67  then the.** orig
2f810 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
2f820 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42   unavailable.  B
2f830 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  ut 8_3_NAMES is 
2f840 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a  only used for.**
2f850 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73   FAT filesystems
2f860 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73   and permissions
2f870 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74   do not matter t
2f880 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73  here, so just us
2f890 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  e.** the default
2f8a0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f   permissions..*/
2f8b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
2f8c0 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a  CreateFileMode(.
2f8d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2f8e0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
2f8f0 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c    /* Path of fil
2f900 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69  e (possibly) bei
2f910 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  ng created */.  
2f920 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f940 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
2f950 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20  as 4th argument 
2f960 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  to xOpen() */.  
2f970 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20  mode_t *pMode,  
2f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f990 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69  /* OUT: Permissi
2f9a0 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ons to open file
2f9b0 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74   with */.  uid_t
2f9c0 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20   *pUid,         
2f9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2f9e0 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: uid to set on
2f9f0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67   the file */.  g
2fa00 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20  id_t *pGid      
2fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fa20 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65  * OUT: gid to se
2fa30 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  t on the file */
2fa40 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2fa50 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2fa60 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2fa70 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65  Code */.  *pMode
2fa80 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20   = 0;.  *pUid = 
2fa90 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a  0;.  *pGid = 0;.
2faa0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53    if( flags & (S
2fab0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
2fac0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2fad0 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20  JOURNAL) ){.    
2fae0 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54  char zDb[MAX_PAT
2faf0 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a  HNAME+1];     /*
2fb00 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   Database file p
2fb10 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ath */.    int n
2fb20 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2fb30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2fb40 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65  er of valid byte
2fb50 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 0a 20 20 20  s in zDb */..   
2fb60 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70   /* zPath is a p
2fb70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20  ath to a WAL or 
2fb80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
2fb90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
2fba0 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a  k derives.    **
2fbb0 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
2fbc0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
2fbd0 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a  base file from z
2fbe0 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b  Path. This block
2fbf0 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20   handles.    ** 
2fc00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61  the following na
2fc10 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  ming conventions
2fc20 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2fc30 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2fc40 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20  journal".    ** 
2fc50 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2fc60 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  wal".    **   "<
2fc70 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72  path to db>-jour
2fc80 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20  nalNN".    **   
2fc90 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61  "<path to db>-wa
2fca0 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lNN".    **.    
2fcb0 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61  ** where NN is a
2fcc0 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e   decimal number.
2fcd0 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73   The NN naming s
2fce0 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20  chemes are .    
2fcf0 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 74  ** used by the t
2fd00 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20  est_multiplex.c 
2fd10 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  module..    */. 
2fd20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33     nDb = sqlite3
2fd30 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20  Strlen30(zPath) 
2fd40 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28  - 1; .    while(
2fd50 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27   zPath[nDb]!='-'
2fd60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
2fd70 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e  normal operation
2fd80 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
2fd90 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 61 6c 77  le name will alw
2fda0 61 79 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  ays contain.    
2fdb0 20 20 2a 2a 20 61 20 27 2d 27 20 63 68 61 72 61    ** a '-' chara
2fdc0 63 74 65 72 2e 20 20 48 6f 77 65 76 65 72 20 69  cter.  However i
2fdd0 6e 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 20 6d  n 8+3 filename m
2fde0 6f 64 65 2c 20 6f 72 20 69 66 20 61 20 63 6f 72  ode, or if a cor
2fdf0 72 75 70 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f  rupt.      ** ro
2fe00 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
2fe10 70 65 63 69 66 69 65 73 20 61 20 6d 61 73 74 65  pecifies a maste
2fe20 72 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 20 61  r journal with a
2fe30 20 67 6f 6f 66 79 20 6e 61 6d 65 2c 20 74 68 65   goofy name, the
2fe40 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 27  n.      ** the '
2fe50 2d 27 20 6d 69 67 68 74 20 62 65 20 6d 69 73 73  -' might be miss
2fe60 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ing. */.      if
2fe70 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74  ( nDb==0 || zPat
2fe80 68 5b 6e 44 62 5d 3d 3d 27 2e 27 20 29 20 72 65  h[nDb]=='.' ) re
2fe90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fea0 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20        nDb--;.   
2feb0 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44   }.    memcpy(zD
2fec0 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a  b, zPath, nDb);.
2fed0 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27      zDb[nDb] = '
2fee0 5c 30 27 3b 0a 0a 20 20 20 20 72 63 20 3d 20 67  \0';..    rc = g
2fef0 65 74 46 69 6c 65 4d 6f 64 65 28 7a 44 62 2c 20  etFileMode(zDb, 
2ff00 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47 69  pMode, pUid, pGi
2ff10 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  d);.  }else if( 
2ff20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2ff30 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
2ff40 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20  E ){.    *pMode 
2ff50 3d 20 30 36 30 30 3b 0a 20 20 7d 65 6c 73 65 20  = 0600;.  }else 
2ff60 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2ff70 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20  TE_OPEN_URI ){. 
2ff80 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2ff90 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65   a main database
2ffa0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
2ffb0 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73  le was opened us
2ffc0 69 6e 67 20 61 20 55 52 49 0a 20 20 20 20 2a 2a  ing a URI.    **
2ffd0 20 66 69 6c 65 6e 61 6d 65 2c 20 63 68 65 63 6b   filename, check
2ffe0 20 66 6f 72 20 74 68 65 20 22 6d 6f 64 65 6f 66   for the "modeof
2fff0 22 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20  " parameter. If 
30000 70 72 65 73 65 6e 74 2c 20 69 6e 74 65 72 70 72  present, interpr
30010 65 74 0a 20 20 20 20 2a 2a 20 69 74 73 20 76 61  et.    ** its va
30020 6c 75 65 20 61 73 20 61 20 66 69 6c 65 6e 61 6d  lue as a filenam
30030 65 20 61 6e 64 20 74 72 79 20 74 6f 20 63 6f 70  e and try to cop
30040 79 20 74 68 65 20 6d 6f 64 65 2c 20 75 69 64 20  y the mode, uid 
30050 61 6e 64 20 67 69 64 20 66 72 6f 6d 0a 20 20 20  and gid from.   
30060 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 2e 20 20   ** that file.  
30070 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
30080 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
30090 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 50 61  ri_parameter(zPa
300a0 74 68 2c 20 22 6d 6f 64 65 6f 66 22 29 3b 0a 20  th, "modeof");. 
300b0 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
300c0 20 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f    rc = getFileMo
300d0 64 65 28 7a 2c 20 70 4d 6f 64 65 2c 20 70 55 69  de(z, pMode, pUi
300e0 64 2c 20 70 47 69 64 29 3b 0a 20 20 20 20 7d 0a  d, pGid);.    }.
300f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
30100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
30110 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a  he file zPath..*
30120 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79  * .** Previously
30130 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20  , the SQLite OS 
30140 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65  layer used three
30150 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c   functions in pl
30160 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f  ace of this.** o
30170 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ne:.**.**     sq
30180 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
30190 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73  rite();.**     s
301a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
301b0 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73  Only();.**     s
301c0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
301d0 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54  usive();.**.** T
301e0 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65  hese calls corre
301f0 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c  spond to the fol
30200 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
30210 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  ons of flags:.**
30220 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74  .**     ReadWrit
30230 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44  e() ->     (READ
30240 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a  WRITE | CREATE).
30250 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28  **     ReadOnly(
30260 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f  )  ->     (READO
30270 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65  NLY) .**     Ope
30280 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20  nExclusive() -> 
30290 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
302a0 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29  ATE | EXCLUSIVE)
302b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f  .**.** The old O
302c0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61  penExclusive() a
302d0 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61  ccepted a boolea
302e0 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65  n argument - "de
302f0 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72  lFlag". If.** tr
30300 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73  ue, the file was
30310 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62   configured to b
30320 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
30330 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
30340 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  .** file handle 
30350 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65  closed. To achie
30360 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65  ve the same effe
30370 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65  ct using this ne
30380 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c  w .** interface,
30390 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f   add the DELETEO
303a0 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74  NCLOSE flag to t
303b0 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61  hose specified a
303c0 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65  bove for .** Ope
303d0 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f  nExclusive()..*/
303e0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
303f0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
30400 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
30410 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
30420 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
30430 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68  s the xOpen meth
30440 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
30450 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
30460 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65       /* Pathname
30470 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f   of file to be o
30480 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
30490 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
304a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
304b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
304c0 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a  o be filled in *
304d0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
304e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304f0 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20   /* Input flags 
30500 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f  to control the o
30510 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  pening */.  int 
30520 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
30530 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
30540 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  ut flags returne
30550 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65  d to SQLite core
30560 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
30570 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65  e *p = (unixFile
30580 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   *)pFile;.  int 
30590 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  fd = -1;        
305a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
305b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65  le descriptor re
305c0 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29  turned by open()
305d0 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c   */.  int openFl
305e0 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
305f0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
30600 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20   pass to open() 
30610 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
30620 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
30630 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
30640 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
30650 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20   int noLock;    
30660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30670 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
30680 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
30690 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
306a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
306b0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
306c0 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
306d0 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67  /.  int ctrlFlag
306e0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
306f0 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a     /* UNIXFILE_*
30700 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74   flags */..  int
30710 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
30720 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
30730 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
30740 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
30750 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
30760 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
30770 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
30780 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
30790 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
307a0 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
307b0 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
307c0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
307d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
307e0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  );.  int isReadW
307f0 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
30800 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
30810 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c  DWRITE);.#if SQL
30820 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
30830 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69  NG_STYLE.  int i
30840 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66  sAutoProxy  = (f
30850 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
30860 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23  EN_AUTOPROXY);.#
30870 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
30880 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
30890 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
308a0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74  CKING_STYLE.  st
308b0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
308c0 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  fo;.#endif..  /*
308d0 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d   If creating a m
308e0 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69  aster or main-fi
308f0 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73  le journal, this
30900 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f   function will o
30910 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d  pen.  ** a file-
30920 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
30930 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e  e directory too.
30940 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
30950 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20  unixSync().  ** 
30960 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69  is called the di
30970 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
30980 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
30990 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c  fsync()ed and cl
309a0 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69  ose()d..  */.  i
309b0 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28 69 73  nt syncDir = (is
309c0 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20  Create && (.    
309d0 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54      eType==SQLIT
309e0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
309f0 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || 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 0a  N_MAIN_JOURNAL .
30a20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
30a30 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
30a40 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72   ));..  /* If ar
30a50 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20  gument zPath is 
30a60 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
30a70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30a80 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65   required to ope
30a90 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61  n.  ** a tempora
30aa0 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69  ry file. Use thi
30ab0 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  s buffer to stor
30ac0 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  e the file name 
30ad0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  in..  */.  char 
30ae0 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zTmpname[MAX_PAT
30af0 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73  HNAME+2];.  cons
30b00 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
30b10 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65  zPath;..  /* Che
30b20 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
30b30 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
30b40 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  true: .  **.  **
30b50 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
30b60 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
30b70 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
30b80 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
30b90 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20  et, and .  **   
30ba0 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
30bb0 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
30bc0 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
30bd0 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
30be0 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
30bf0 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
30c00 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
30c10 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
30c20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
30c30 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
30c40 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
30c50 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
30c60 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
30c70 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
30c80 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
30c90 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
30ca0 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
30cb0 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
30cc0 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
30cd0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
30ce0 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
30cf0 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
30d00 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
30d10 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
30d20 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
30d30 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20  in journal, WAL 
30d40 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20  file and master 
30d50 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65  journal are neve
30d60 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  r .  ** automati
30d70 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e  cally deleted. N
30d80 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72  or are they ever
30d90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
30da0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
30db0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
30dc0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
30dd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
30de0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
30df0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
30e00 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
30e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
30e20 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
30e30 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
30e40 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
30e50 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
30e60 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29  MASTER_JOURNAL )
30e70 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
30e80 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
30e90 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
30ea0 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20  E_OPEN_WAL );.. 
30eb0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
30ec0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
30ed0 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74  has set one of t
30ee0 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66  he "file-type" f
30ef0 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lags. */.  asser
30f00 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
30f10 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20  _OPEN_MAIN_DB   
30f20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
30f30 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
30f40 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
30f50 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
30f60 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
30f70 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
30f80 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a  N_TEMP_JOURNAL .
30f90 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
30fa0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
30fb0 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
30fc0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
30fd0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
30fe0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
30ff0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  =SQLITE_OPEN_TRA
31000 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79  NSIENT_DB || eTy
31010 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
31020 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44  WAL.  );..  /* D
31030 65 74 65 63 74 20 61 20 70 69 64 20 63 68 61 6e  etect a pid chan
31040 67 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  ge and reset the
31050 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69 73   PRNG.  There is
31060 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
31070 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63 68  n.  ** here such
31080 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72   that two or mor
31090 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74 72  e threads all tr
310a0 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61 74  ying to open dat
310b0 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20 74  abases at.  ** t
310c0 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74 20  he same instant 
310d0 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74 20  might all reset 
310e0 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20 6d  the PRNG.  But m
310f0 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a 20  ultiple resets. 
31100 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73 73   ** are harmless
31110 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e  ..  */.  if( ran
31120 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73 47 65  domnessPid!=osGe
31130 74 70 69 64 28 30 29 20 29 7b 0a 20 20 20 20 72  tpid(0) ){.    r
31140 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f  andomnessPid = o
31150 73 47 65 74 70 69 64 28 30 29 3b 0a 20 20 20 20  sGetpid(0);.    
31160 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
31170 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20  ss(0,0);.  }..  
31180 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
31190 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
311a0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
311b0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
311c0 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
311d0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
311e0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
311f0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
31200 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
31210 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
31220 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
31230 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
31240 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
31250 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
31260 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  64(sizeof(*pUnus
31270 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
31280 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
31290 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
312a0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
312b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
312c0 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
312d0 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
312e0 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ;..    /* Databa
312f0 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
31300 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
31310 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
31320 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55  are not.    ** U
31330 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
31340 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
31350 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
31360 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20  passed into.    
31370 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
31380 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20  arameter(). */. 
31390 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67     assert( (flag
313a0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
313b0 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74  URI) || zName[st
313c0 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d  rlen(zName)+1]==
313d0 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66  0 );..  }else if
313e0 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( !zName ){.    
313f0 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e  /* If zName is N
31400 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ULL, the upper l
31410 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69  ayer is requesti
31420 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  ng a temp file. 
31430 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  */.    assert(is
31440 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44  Delete && !syncD
31450 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e  ir);.    rc = un
31460 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56  ixGetTempname(pV
31470 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
31480 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
31490 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
314a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
314b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
314c0 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
314d0 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
314e0 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
314f0 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79  enames are alway
31500 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  s double-zero te
31510 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20  rminated.    ** 
31520 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69 74  for use by sqlit
31530 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
31540 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (). */.    asser
31550 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28  t( zName[strlen(
31560 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  zName)+1]==0 );.
31570 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
31580 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
31590 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
315a0 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50  eter passed to P
315b0 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20  OSIX function.  
315c0 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65  ** open(). These
315d0 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61   must be calcula
315e0 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e  ted even if open
315f0 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
31600 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d  , as.  ** they m
31610 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
31620 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
31630 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64   handle and used
31640 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63   by the .  ** 'c
31650 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69  onch file' locki
31660 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74  ng functions lat
31670 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  er on.  */.  if(
31680 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
31690 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
316a0 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
316b0 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c  adWrite ) openFl
316c0 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
316d0 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
316e0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
316f0 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69  O_CREAT;.  if( i
31700 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65  sExclusive ) ope
31710 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43  nFlags |= (O_EXC
31720 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20  L|O_NOFOLLOW);. 
31730 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
31740 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
31750 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c  ARY);..  if( fd<
31760 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
31770 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
31780 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
31790 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
317a0 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
317b0 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20   uid_t uid;     
317c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
317d0 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65  * Userid for the
317e0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64   file */.    gid
317f0 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20  _t gid;         
31800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72             /* Gr
31810 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69  oupid for the fi
31820 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  le */.    rc = f
31830 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
31840 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
31850 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c  &openMode, &uid,
31860 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20   &gid);.    if( 
31870 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
31890 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
318a0 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20  Unused );.      
318b0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
318c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
318d0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
318e0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
318f0 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L );.      retur
31900 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
31910 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
31920 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
31930 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
31940 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
31950 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c  X   %-3d %s 0%o\
31960 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f  n", fd, zName, o
31970 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  penFlags));.    
31980 61 73 73 65 72 74 28 20 21 69 73 45 78 63 6c 75  assert( !isExclu
31990 73 69 76 65 20 7c 7c 20 28 6f 70 65 6e 46 6c 61  sive || (openFla
319a0 67 73 20 26 20 4f 5f 43 52 45 41 54 29 21 3d 30  gs & O_CREAT)!=0
319b0 20 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30   );.    if( fd<0
319c0 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49   && errno!=EISDI
319d0 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65  R && isReadWrite
319e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   ){.      /* Fai
319f0 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  led to open the 
31a00 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72  file for read/wr
31a10 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20  ite access. Try 
31a20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  read-only. */.  
31a30 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53      flags &= ~(S
31a40 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
31a50 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
31a60 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20  _CREATE);.      
31a70 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f  openFlags &= ~(O
31a80 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a  _RDWR|O_CREAT);.
31a90 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
31aa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
31ab0 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46  NLY;.      openF
31ac0 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
31ad0 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e  ;.      isReadon
31ae0 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64  ly = 1;.      fd
31af0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
31b00 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
31b10 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
31b20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  }.    if( fd<0 )
31b30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
31b40 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
31b50 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
31b60 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a  "open", zName);.
31b70 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
31b80 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
31b90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
31ba0 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69  process is runni
31bb0 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69  ng as root and i
31bc0 66 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77  f creating a new
31bd0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a   rollback.    **
31be0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20   journal or WAL 
31bf0 66 69 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77  file, set the ow
31c00 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a  nership of the j
31c10 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f  ournal or WAL to
31c20 20 62 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73   be.    ** the s
31c30 61 6d 65 20 61 73 20 74 68 65 20 6f 72 69 67 69  ame as the origi
31c40 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20  nal database..  
31c50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61    */.    if( fla
31c60 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
31c70 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
31c80 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
31c90 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46  ){.      robustF
31ca0 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20 67  chown(fd, uid, g
31cb0 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  id);.    }.  }. 
31cc0 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29   assert( fd>=0 )
31cd0 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ;.  if( pOutFlag
31ce0 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c  s ){.    *pOutFl
31cf0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
31d00 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 61  ..  if( p->pPrea
31d10 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20 29  llocatedUnused )
31d20 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c  {.    p->pPreall
31d30 6f 63 61 74 65 64 55 6e 75 73 65 64 2d 3e 66 64  ocatedUnused->fd
31d40 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 50   = fd;.    p->pP
31d50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
31d60 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  d->flags = flags
31d70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44  ;.  }..  if( isD
31d80 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f  elete ){.#if OS_
31d90 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74  VXWORKS.    zPat
31da0 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 69 66  h = zName;.#elif
31db0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
31dc0 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f  UNLINK_AFTER_CLO
31dd0 53 45 29 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  SE).    zPath = 
31de0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
31df0 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  "%s", zName);.  
31e00 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
31e10 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  {.      robust_c
31e20 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
31e30 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 72 65 74  NE__);.      ret
31e40 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
31e50 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c  _BKPT;.    }.#el
31e60 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  se.    osUnlink(
31e70 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  zName);.#endif. 
31e80 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   }.#if SQLITE_EN
31e90 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
31ea0 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70  LE.  else{.    p
31eb0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
31ec0 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e  enFlags;.  }.#en
31ed0 64 69 66 0a 20 20 0a 23 69 66 20 64 65 66 69 6e  dif.  .#if defin
31ee0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
31ef0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
31f00 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
31f10 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20 26  f( fstatfs(fd, &
31f20 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
31f30 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
31f40 72 6e 6f 28 70 2c 20 65 72 72 6e 6f 29 3b 0a 20  rno(p, errno);. 
31f50 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
31f60 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p, fd, __LINE__)
31f70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
31f80 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
31f90 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d  ;.  }.  if (0 ==
31fa0 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22   strncmp("msdos"
31fb0 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  , fsInfo.f_fstyp
31fc0 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20  ename, 5)) {.   
31fd0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
31fe0 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20  le)->fsFlags |= 
31ff0 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
32000 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20 20 69  S_MSDOS;.  }.  i
32010 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
32020 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e  "exfat", fsInfo.
32030 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
32040 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  ) {.    ((unixFi
32050 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c  le*)pFile)->fsFl
32060 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53  ags |= SQLITE_FS
32070 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a  FLAGS_IS_MSDOS;.
32080 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
32090 20 53 65 74 20 75 70 20 61 70 70 72 6f 70 72 69   Set up appropri
320a0 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f  ate ctrlFlags */
320b0 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
320c0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
320d0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
320e0 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
320f0 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
32100 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  )              c
32110 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
32120 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 6e  FILE_RDONLY;.  n
32130 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53  oLock = eType!=S
32140 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
32150 44 42 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b  DB;.  if( noLock
32160 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
32170 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
32180 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
32190 3b 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72 20  ;.  if( syncDir 
321a0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
321b0 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
321c0 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b  NIXFILE_DIRSYNC;
321d0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
321e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29  QLITE_OPEN_URI )
321f0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
32200 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66  IXFILE_URI;..#if
32210 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
32220 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66  OCKING_STYLE.#if
32230 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
32240 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69  ROXY_LOCKING.  i
32250 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a  sAutoProxy = 1;.
32260 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41  #endif.  if( isA
32270 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61  utoProxy && (zPa
32280 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e  th!=NULL) && (!n
32290 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e  oLock) && pVfs->
322a0 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  xOpen ){.    cha
322b0 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65  r *envforce = ge
322c0 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52  tenv("SQLITE_FOR
322d0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
322e0 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50  ");.    int useP
322f0 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  roxy = 0;..    /
32300 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  * SQLITE_FORCE_P
32310 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20  ROXY_LOCKING==1 
32320 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61  means force alwa
32330 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20  ys use proxy, 0 
32340 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65  means .    ** ne
32350 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e  ver use proxy, N
32360 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72  ULL means use pr
32370 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61  oxy for non-loca
32380 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a  l files only.  *
32390 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72  /.    if( envfor
323a0 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ce!=NULL ){.    
323b0 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f    useProxy = ato
323c0 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20  i(envforce)>0;. 
323d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
323e0 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49  useProxy = !(fsI
323f0 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
32400 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  LOCAL);.    }.  
32410 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29    if( useProxy )
32420 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c  {.      rc = fil
32430 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
32440 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  , fd, pFile, zPa
32450 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a  th, ctrlFlags);.
32460 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32480 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
32490 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28  nsformUnixFile((
324a0 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c  unixFile*)pFile,
324b0 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20   ":auto:");.    
324c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
324d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
324e0 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c     /* Use unixCl
324f0 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  ose to clean up 
32500 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64  the resources ad
32510 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69  ded in fillInUni
32520 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20  xFile .         
32530 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c   ** and clear al
32540 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27  l the structure'
32550 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53  s references.  S
32560 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20  pecifically, .  
32570 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65          ** pFile
32580 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20  ->pMethods will 
32590 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74  be NULL so sqlit
325a0 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62  e3OsClose will b
325b0 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20  e a no-op .     
325c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
325d0 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c    unixClose(pFil
325e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
325f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
32600 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
32610 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
32620 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  hed;.    }.  }.#
32630 65 6e 64 69 66 0a 20 20 0a 20 20 61 73 73 65 72  endif.  .  asser
32640 74 28 20 7a 50 61 74 68 3d 3d 30 20 7c 7c 20 7a  t( zPath==0 || z
32650 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20  Path[0]=='/' .  
32660 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
32670 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
32680 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
32690 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
326a0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 29  AIN_JOURNAL .  )
326b0 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55  ;.  rc = fillInU
326c0 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
326d0 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
326e0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65  ctrlFlags);..ope
326f0 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66  n_finished:.  if
32700 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32710 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
32720 72 65 65 28 70 2d 3e 70 50 72 65 61 6c 6c 6f 63  ree(p->pPrealloc
32730 61 74 65 64 55 6e 75 73 65 64 29 3b 0a 20 20 7d  atedUnused);.  }
32740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32750 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
32760 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68  he file at zPath
32770 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
32780 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
32790 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68  e, fsync().** th
327a0 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  e directory afte
327b0 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  r deleting the f
327c0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
327d0 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20  nt unixDelete(. 
327e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
327f0 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46  tUsed,     /* VF
32800 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
32810 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65  s as the xDelete
32820 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
32830 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
32840 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
32850 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  f file to be del
32860 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  eted */.  int di
32870 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  rSync           
32880 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
32890 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72  fsync() director
328a0 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
328b0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
328c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
328d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
328e0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
328f0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
32900 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
32910 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
32920 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61  if( osUnlink(zPa
32930 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  th)==(-1) ){.   
32940 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45   if( errno==ENOE
32950 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  NT.#if OS_VXWORK
32960 53 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41  S.        || osA
32970 63 63 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d  ccess(zPath,0)!=
32980 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a  0.#endif.    ){.
32990 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
329a0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
329b0 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OENT;.    }else{
329c0 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
329d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
329e0 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
329f0 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
32a00 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
32a10 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66   rc;.  }.#ifndef
32a20 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
32a30 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64  DIRSYNC.  if( (d
32a40 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29  irSync & 1)!=0 )
32a50 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
32a60 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
32a70 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
32a80 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
32a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32aa0 20 20 20 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e     if( full_fsyn
32ab0 63 28 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20  c(fd,0,0) ){.   
32ac0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
32ad0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
32ae0 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22  ERR_DIR_FSYNC, "
32af0 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a  fsync", zPath);.
32b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f        }.      ro
32b10 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
32b20 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
32b30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
32b40 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
32b50 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20  _CANTOPEN );.   
32b60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
32b70 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  K;.    }.  }.#en
32b80 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
32b90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  .}../*.** Test t
32ba0 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20  he existence of 
32bb0 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  or access permis
32bc0 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50  sions of file zP
32bd0 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74  ath. The.** test
32be0 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e   performed depen
32bf0 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
32c00 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
32c10 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
32c20 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e  S_EXISTS: Return
32c30 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65   1 if the file e
32c40 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c  xists.**     SQL
32c50 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
32c60 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69  RITE: Return 1 i
32c70 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
32c80 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e  ad and writable.
32c90 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
32ca0 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20  CCESS_READONLY: 
32cb0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
32cc0 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65  file is readable
32cd0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
32ce0 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  e return 0..*/.s
32cf0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63  tatic int unixAc
32d00 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
32d10 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  vfs *NotUsed,   
32d20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61  /* The VFS conta
32d30 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65  ining this xAcce
32d40 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  ss method */.  c
32d50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
32d60 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f  ,      /* Path o
32d70 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78  f the file to ex
32d80 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66  amine */.  int f
32d90 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
32da0 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65     /* What do we
32db0 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61   want to learn a
32dc0 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66  bout the zPath f
32dd0 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ile? */.  int *p
32de0 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
32df0 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
32e00 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a  t boolean here *
32e10 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
32e20 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
32e30 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
32e40 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
32e50 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
32e60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
32e70 65 73 4f 75 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  esOut!=0 );..  /
32e80 2a 20 54 68 65 20 73 70 65 63 20 73 61 79 73 20  * The spec says 
32e90 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
32ea0 70 6f 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20  possible values 
32eb0 66 6f 72 20 66 6c 61 67 73 2e 20 20 42 75 74 20  for flags.  But 
32ec0 6f 6e 6c 79 0a 20 20 2a 2a 20 74 77 6f 20 6f 66  only.  ** two of
32ed0 20 74 68 65 6d 20 61 72 65 20 61 63 74 75 61 6c   them are actual
32ee0 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 61 73 73  ly used */.  ass
32ef0 65 72 74 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49  ert( flags==SQLI
32f00 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
32f10 20 7c 7c 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54   || flags==SQLIT
32f20 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
32f30 54 45 20 29 3b 0a 0a 20 20 69 66 28 20 66 6c 61  TE );..  if( fla
32f40 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
32f50 53 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20  S_EXISTS ){.    
32f60 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
32f70 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
32f80 28 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68  (0==osStat(zPath
32f90 2c 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73  , &buf) && buf.s
32fa0 74 5f 73 69 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c  t_size>0);.  }el
32fb0 73 65 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74  se{.    *pResOut
32fc0 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74   = osAccess(zPat
32fd0 68 2c 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30  h, W_OK|R_OK)==0
32fe0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
32ff0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
33000 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
33010 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28   mkFullPathname(
33020 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
33030 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
33040 20 20 20 2f 2a 20 49 6e 70 75 74 20 70 61 74 68     /* Input path
33050 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
33060 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33070 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
33080 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
33090 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
330a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
330b0 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
330c0 20 62 75 66 66 65 72 20 7a 4f 75 74 20 2a 2f 0a   buffer zOut */.
330d0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 74 68 20 3d  ){.  int nPath =
330e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
330f0 28 7a 50 61 74 68 29 3b 0a 20 20 69 6e 74 20 69  (zPath);.  int i
33100 4f 66 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  Off = 0;.  if( z
33110 50 61 74 68 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a  Path[0]!='/' ){.
33120 20 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 64      if( osGetcwd
33130 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 32 29 3d 3d  (zOut, nOut-2)==
33140 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
33150 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
33160 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
33170 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a  KPT, "getcwd", z
33180 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
33190 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 53   iOff = sqlite3S
331a0 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20  trlen30(zOut);. 
331b0 20 20 20 7a 4f 75 74 5b 69 4f 66 66 2b 2b 5d 20     zOut[iOff++] 
331c0 3d 20 27 2f 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '/';.  }.  if(
331d0 20 28 69 4f 66 66 2b 6e 50 61 74 68 2b 31 29 3e   (iOff+nPath+1)>
331e0 6e 4f 75 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  nOut ){.    /* S
331f0 51 4c 69 74 65 20 61 73 73 75 6d 65 73 20 74 68  QLite assumes th
33200 61 74 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  at xFullPathname
33210 28 29 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  () nul-terminate
33220 73 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  s the output buf
33230 66 65 72 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20  fer.    ** even 
33240 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 61 6e  if it returns an
33250 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20   error.  */.    
33260 7a 4f 75 74 5b 69 4f 66 66 5d 20 3d 20 27 5c 30  zOut[iOff] = '\0
33270 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ';.    return SQ
33280 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
33290 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
332a0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
332b0 69 4f 66 66 2c 20 26 7a 4f 75 74 5b 69 4f 66 66  iOff, &zOut[iOff
332c0 5d 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  ], "%s", zPath);
332d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
332e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75  _OK;.}../*.** Tu
332f0 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
33300 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
33310 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ll pathname. The
33320 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a   relative path.*
33330 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  * is stored as a
33340 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
33350 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75  string in the bu
33360 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
33370 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a  by.** zPath. .**
33380 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20  .** zOut points 
33390 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
333a0 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f  t least sqlite3_
333b0 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62  vfs.mxPathname b
333c0 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69  ytes .** (in thi
333d0 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48  s case, MAX_PATH
333e0 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65  NAME bytes). The
333f0 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72   full-path is wr
33400 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73  itten to.** this
33410 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72   buffer before r
33420 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
33430 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c  tic int unixFull
33440 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
33450 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
33460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
33470 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
33480 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
33490 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
334a0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
334b0 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
334c0 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
334d0 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
334e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
334f0 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
33500 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
33510 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
33520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33530 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
33540 2f 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  /.){.#if !define
33550 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29  d(HAVE_READLINK)
33560 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 48 41 56   || !defined(HAV
33570 45 5f 4c 53 54 41 54 29 0a 20 20 72 65 74 75 72  E_LSTAT).  retur
33580 6e 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65  n mkFullPathname
33590 28 7a 50 61 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f  (zPath, zOut, nO
335a0 75 74 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ut);.#else.  int
335b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
335c0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
335d0 69 6e 74 20 6e 4c 69 6e 6b 20 3d 20 31 3b 20 20  int nLink = 1;  
335e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
335f0 20 4e 75 6d 62 65 72 20 6f 66 20 73 79 6d 62 6f   Number of symbo
33600 6c 69 63 20 6c 69 6e 6b 73 20 66 6f 6c 6c 6f 77  lic links follow
33610 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63  ed so far */.  c
33620 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d  onst char *zIn =
33630 20 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20   zPath;      /* 
33640 49 6e 70 75 74 20 70 61 74 68 20 66 6f 72 20 65  Input path for e
33650 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
33660 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20   loop */.  char 
33670 2a 7a 44 65 6c 20 3d 20 30 3b 0a 0a 20 20 61 73  *zDel = 0;..  as
33680 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61  sert( pVfs->mxPa
33690 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48  thname==MAX_PATH
336a0 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44  NAME );.  UNUSED
336b0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
336c0 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
336d0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
336e0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
336f0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
33700 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
33710 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
33720 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
33730 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
33740 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
33750 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
33760 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
33770 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
33780 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
33790 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
337a0 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
337b0 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
337c0 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
337d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
337e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
337f0 52 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 0a 20 20  R );..  do {..  
33800 20 20 2f 2a 20 43 61 6c 6c 20 73 74 61 74 28 29    /* Call stat()
33810 20 6f 6e 20 70 61 74 68 20 7a 49 6e 2e 20 53 65   on path zIn. Se
33820 74 20 62 4c 69 6e 6b 20 74 6f 20 74 72 75 65 20  t bLink to true 
33830 69 66 20 74 68 65 20 70 61 74 68 20 69 73 20 61  if the path is a
33840 20 73 79 6d 62 6f 6c 69 63 0a 20 20 20 20 2a 2a   symbolic.    **
33850 20 6c 69 6e 6b 2c 20 6f 72 20 66 61 6c 73 65 20   link, or false 
33860 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a 20  otherwise.  */. 
33870 20 20 20 69 6e 74 20 62 4c 69 6e 6b 20 3d 20 30     int bLink = 0
33880 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
33890 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20 6f  t buf;.    if( o
338a0 73 4c 73 74 61 74 28 7a 49 6e 2c 20 26 62 75 66  sLstat(zIn, &buf
338b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
338c0 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20  ( errno!=ENOENT 
338d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
338e0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
338f0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
33900 54 2c 20 22 6c 73 74 61 74 22 2c 20 7a 49 6e 29  T, "lstat", zIn)
33910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
33920 6c 73 65 7b 0a 20 20 20 20 20 20 62 4c 69 6e 6b  lse{.      bLink
33930 20 3d 20 53 5f 49 53 4c 4e 4b 28 62 75 66 2e 73   = S_ISLNK(buf.s
33940 74 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a  t_mode);.    }..
33950 20 20 20 20 69 66 28 20 62 4c 69 6e 6b 20 29 7b      if( bLink ){
33960 0a 20 20 20 20 20 20 69 66 28 20 7a 44 65 6c 3d  .      if( zDel=
33970 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  =0 ){.        zD
33980 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  el = sqlite3_mal
33990 6c 6f 63 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20  loc(nOut);.     
339a0 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29     if( zDel==0 )
339b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
339c0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
339d0 65 6c 73 65 20 69 66 28 20 2b 2b 6e 4c 69 6e 6b  else if( ++nLink
339e0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53 59 4d 4c  >SQLITE_MAX_SYML
339f0 49 4e 4b 53 20 29 7b 0a 20 20 20 20 20 20 20 20  INKS ){.        
33a00 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
33a10 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
33a20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
33a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33a40 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 6f         nByte = o
33a50 73 52 65 61 64 6c 69 6e 6b 28 7a 49 6e 2c 20 7a  sReadlink(zIn, z
33a60 44 65 6c 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20  Del, nOut-1);.  
33a70 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c        if( nByte<
33a80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
33a90 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
33aa0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
33ab0 5f 42 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e 6b  _BKPT, "readlink
33ac0 22 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20 20  ", zIn);.       
33ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33ae0 20 20 69 66 28 20 7a 44 65 6c 5b 30 5d 21 3d 27    if( zDel[0]!='
33af0 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  /' ){.          
33b00 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
33b10 20 20 20 20 20 66 6f 72 28 6e 20 3d 20 73 71 6c       for(n = sql
33b20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 6e  ite3Strlen30(zIn
33b30 29 3b 20 6e 3e 30 20 26 26 20 7a 49 6e 5b 6e 2d  ); n>0 && zIn[n-
33b40 31 5d 21 3d 27 2f 27 3b 20 6e 2d 2d 29 3b 0a 20  1]!='/'; n--);. 
33b50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
33b60 42 79 74 65 2b 6e 2b 31 3e 6e 4f 75 74 20 29 7b  Byte+n+1>nOut ){
33b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
33b80 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
33b90 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
33ba0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33bb0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f             memmo
33bc0 76 65 28 26 7a 44 65 6c 5b 6e 5d 2c 20 7a 44 65  ve(&zDel[n], zDe
33bd0 6c 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20  l, nByte+1);.   
33be0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
33bf0 79 28 7a 44 65 6c 2c 20 7a 49 6e 2c 20 6e 29 3b  y(zDel, zIn, n);
33c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
33c10 42 79 74 65 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Byte += n;.     
33c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33c30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
33c40 44 65 6c 5b 6e 42 79 74 65 5d 20 3d 20 27 5c 30  Del[nByte] = '\0
33c50 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
33c60 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 49 6e 20     }..      zIn 
33c70 3d 20 7a 44 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20  = zDel;.    }.. 
33c80 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
33c90 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 49 6e 21  QLITE_OK || zIn!
33ca0 3d 7a 4f 75 74 20 7c 7c 20 7a 49 6e 5b 30 5d 3d  =zOut || zIn[0]=
33cb0 3d 27 2f 27 20 29 3b 0a 20 20 20 20 69 66 28 20  ='/' );.    if( 
33cc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
33cd0 20 7a 49 6e 21 3d 7a 4f 75 74 20 29 7b 0a 20 20   zIn!=zOut ){.  
33ce0 20 20 20 20 72 63 20 3d 20 6d 6b 46 75 6c 6c 50      rc = mkFullP
33cf0 61 74 68 6e 61 6d 65 28 7a 49 6e 2c 20 7a 4f 75  athname(zIn, zOu
33d00 74 2c 20 6e 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  t, nOut);.    }.
33d10 20 20 20 20 69 66 28 20 62 4c 69 6e 6b 3d 3d 30      if( bLink==0
33d20 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 49   ) break;.    zI
33d30 6e 20 3d 20 7a 4f 75 74 3b 0a 20 20 7d 77 68 69  n = zOut;.  }whi
33d40 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
33d50 4b 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  K );..  sqlite3_
33d60 66 72 65 65 28 7a 44 65 6c 29 3b 0a 20 20 72 65  free(zDel);.  re
33d70 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 20  turn rc;.#endif 
33d80 20 20 2f 2a 20 48 41 56 45 5f 52 45 41 44 4c 49    /* HAVE_READLI
33d90 4e 4b 20 26 26 20 48 41 56 45 5f 4c 53 54 41 54  NK && HAVE_LSTAT
33da0 20 2a 2f 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20   */.}...#ifndef 
33db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
33dc0 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
33dd0 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
33de0 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
33df0 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
33e00 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
33e10 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
33e20 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
33e30 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
33e40 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
33e50 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e  #include <dlfcn.
33e60 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  h>.static void *
33e70 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74  unixDlOpen(sqlit
33e80 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
33e90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
33ea0 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45  lename){.  UNUSE
33eb0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
33ec0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  sed);.  return d
33ed0 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  lopen(zFilename,
33ee0 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44   RTLD_NOW | RTLD
33ef0 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a  _GLOBAL);.}../*.
33f00 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  ** SQLite calls 
33f10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d  this function im
33f20 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
33f30 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c  a call to unixDl
33f40 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78  Sym() or.** unix
33f50 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28  DlOpen() fails (
33f60 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70  returns a null p
33f70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f  ointer). If a mo
33f80 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f  re detailed erro
33f90 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20  r.** message is 
33fa0 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73  available, it is
33fb0 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66   written to zBuf
33fc0 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  Out. If no error
33fd0 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61   message.** is a
33fe0 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75  vailable, zBufOu
33ff0 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  t is left unmodi
34000 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20  fied and SQLite 
34010 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a  uses a default.*
34020 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  * error message.
34030 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
34040 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69  unixDlError(sqli
34050 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
34060 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
34070 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f   *zBufOut){.  co
34080 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
34090 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
340a0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75  ER(NotUsed);.  u
340b0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
340c0 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f  .  zErr = dlerro
340d0 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  r();.  if( zErr 
340e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
340f0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
34100 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72  ufOut, "%s", zEr
34110 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  r);.  }.  unixLe
34120 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74  aveMutex();.}.st
34130 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78  atic void (*unix
34140 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
34150 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64  s *NotUsed, void
34160 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a   *p, const char*
34170 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20  zSym))(void){.  
34180 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74  /* .  ** GCC wit
34190 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
341a0 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39 30  rs says that C90
341b0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
341c0 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20  a void* to be.  
341d0 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70  ** cast into a p
341e0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
341f0 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74  tion.  And yet t
34200 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d  he library dlsym
34210 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20  () routine.  ** 
34220 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20  returns a void* 
34230 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
34240 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
34250 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77  unction.  So how
34260 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20   do we.  ** use 
34270 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65  dlsym() with -pe
34280 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20  dantic-errors?. 
34290 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c   **.  ** Variabl
342a0 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66  e x below is def
342b0 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69  ined to be a poi
342c0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
342d0 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70  on taking.  ** p
342e0 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20  arameters void* 
342f0 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  and const char* 
34300 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20  and returning a 
34310 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
34320 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69  ction..  ** We i
34330 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61  nitialize x by a
34340 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f  ssigning it a po
34350 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73  inter to the dls
34360 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  ym() function.. 
34370 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e   ** (That assign
34380 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61 20  ment requires a 
34390 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20  cast.)  Then we 
343a0 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f  call the functio
343b0 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f  n that.  ** x po
343c0 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a  ints to.  .  **.
343d0 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61    ** This work-a
343e0 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c  round is unlikel
343f0 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63  y to work correc
34400 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65  tly on any syste
34410 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75  m where.  ** you
34420 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63   really cannot c
34430 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ast a function p
34440 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64  ointer into void
34450 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e  *.  But then, on
34460 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
34470 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69  hand, dlsym() wi
34480 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73  ll not work on s
34490 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 74  uch a system eit
344a0 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a  her, so we have.
344b0 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20    ** not really 
344c0 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20  lost anything.. 
344d0 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78   */.  void (*(*x
344e0 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
344f0 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55  ar*))(void);.  U
34500 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34510 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20  NotUsed);.  x = 
34520 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a  (void(*(*)(void*
34530 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76  ,const char*))(v
34540 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65  oid))dlsym;.  re
34550 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79  turn (*x)(p, zSy
34560 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  m);.}.static voi
34570 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71  d unixDlClose(sq
34580 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
34590 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  ed, void *pHandl
345a0 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
345b0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
345c0 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64  .  dlclose(pHand
345d0 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
345e0 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
345f0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
34600 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
34610 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65  define unixDlOpe
34620 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  n  0.  #define u
34630 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  nixDlError 0.  #
34640 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d  define unixDlSym
34650 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75     0.  #define u
34660 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e  nixDlClose 0.#en
34670 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
34680 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
34690 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68  andom data to th
346a0 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
346b0 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
346c0 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d  c int unixRandom
346d0 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
346e0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
346f0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
34700 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
34710 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
34720 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29   assert((size_t)
34730 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69  nBuf>=(sizeof(ti
34740 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74  me_t)+sizeof(int
34750 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61  )));..  /* We ha
34760 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ve to initialize
34770 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74   zBuf to prevent
34780 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72   valgrind from r
34790 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72  eporting.  ** er
347a0 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72  rors.  The repor
347b0 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c  ts issued by val
347c0 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72  grind are incorr
347d0 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20  ect - we would. 
347e0 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20   ** prefer that 
347f0 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62  the randomness b
34800 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d  e increased by m
34810 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65  aking use of the
34820 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69  .  ** uninitiali
34830 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75  zed space in zBu
34840 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64  f - but valgrind
34850 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20   errors tend to 
34860 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20  worry.  ** some 
34870 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74  users.  Rather t
34880 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65  han argue, it se
34890 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20  ems easier just 
348a0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20  to initialize.  
348b0 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72  ** the whole arr
348c0 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76  ay and silence v
348d0 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66  algrind, even if
348e0 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73   that means less
348f0 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a   randomness.  **
34900 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73   in the random s
34910 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  eed..  **.  ** W
34920 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69  hen testing, ini
34930 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d  tializing zBuf[]
34940 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20   to zero is all 
34950 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61  we do.  That mea
34960 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20  ns.  ** that we 
34970 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73  always use the s
34980 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  ame random numbe
34990 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69  r sequence.  Thi
349a0 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a  s makes the.  **
349b0 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c   tests repeatabl
349c0 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  e..  */.  memset
349d0 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
349e0 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  .  randomnessPid
349f0 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 20   = osGetpid(0); 
34a00 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
34a10 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 21  QLITE_TEST) && !
34a20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
34a30 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a  MIT_RANDOMNESS).
34a40 20 20 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c 20    {.    int fd, 
34a50 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  got;.    fd = ro
34a60 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f  bust_open("/dev/
34a70 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e  urandom", O_RDON
34a80 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LY, 0);.    if( 
34a90 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69  fd<0 ){.      ti
34aa0 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69  me_t t;.      ti
34ab0 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65  me(&t);.      me
34ac0 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73  mcpy(zBuf, &t, s
34ad0 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20  izeof(t));.     
34ae0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
34af0 7a 65 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64 6f  zeof(t)], &rando
34b00 6d 6e 65 73 73 50 69 64 2c 20 73 69 7a 65 6f 66  mnessPid, sizeof
34b10 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 29  (randomnessPid))
34b20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34b30 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66  sizeof(t)+sizeof
34b40 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3c  (randomnessPid)<
34b50 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b  =(size_t)nBuf );
34b60 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69  .      nBuf = si
34b70 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66  zeof(t) + sizeof
34b80 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3b  (randomnessPid);
34b90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
34ba0 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65    do{ got = osRe
34bb0 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
34bc0 66 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c  f); }while( got<
34bd0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
34be0 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73  R );.      robus
34bf0 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f  t_close(0, fd, _
34c00 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
34c10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
34c20 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a  urn nBuf;.}.../*
34c30 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
34c40 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
34c50 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
34c60 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
34c70 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
34c80 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
34c90 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65   microseconds we
34ca0 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a   want to sleep..
34cb0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
34cc0 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
34cd0 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
34ce0 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61  s of sleep actua
34cf0 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  lly.** requested
34d00 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
34d10 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73  ying operating s
34d20 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20  ystem, a number 
34d30 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
34d40 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
34d50 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
34d60 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  rgument, but not
34d70 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68   less.** than th
34d80 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
34d90 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c  tatic int unixSl
34da0 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
34db0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69  *NotUsed, int mi
34dc0 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  croseconds){.#if
34dd0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
34de0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70  ruct timespec sp
34df0 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d  ;..  sp.tv_sec =
34e00 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20   microseconds / 
34e10 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76  1000000;.  sp.tv
34e20 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65  _nsec = (microse
34e30 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29  conds % 1000000)
34e40 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73   * 1000;.  nanos
34e50 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b  leep(&sp, NULL);
34e60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
34e70 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
34e80 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
34e90 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  nds;.#elif defin
34ea0 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
34eb0 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  && HAVE_USLEEP. 
34ec0 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63   usleep(microsec
34ed0 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
34ee0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
34ef0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
34f00 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65  roseconds;.#else
34f10 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d  .  int seconds =
34f20 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39   (microseconds+9
34f30 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a  99999)/1000000;.
34f40 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29    sleep(seconds)
34f50 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
34f60 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
34f70 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a   return seconds*
34f80 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  1000000;.#endif.
34f90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
34fa0 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
34fb0 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
34fc0 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
34fd0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
34fe0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
34ff0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
35000 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
35010 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
35020 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
35030 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
35040 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
35050 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
35060 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
35070 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
35080 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
35090 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
350a0 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
350b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
350c0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
350d0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
350e0 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
350f0 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74  ime).  Write int
35100 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20  o *piNow.** the 
35110 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
35120 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
35130 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d  n Day number tim
35140 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20  es 86_400_000.  
35150 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64  In.** other word
35160 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70  s, write into *p
35170 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20  iNow the number 
35180 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
35190 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e  since the Julian
351a0 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f  .** epoch of noo
351b0 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f  n in Greenwich o
351c0 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34  n November 24, 4
351d0 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e  714 B.C accordin
351e0 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c  g to the.** prol
351f0 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20  eptic Gregorian 
35200 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20  calendar..**.** 
35210 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
35220 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52  rn SQLITE_OK.  R
35230 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
35240 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61  OR if the time a
35250 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e  nd date .** cann
35260 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
35270 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
35280 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
35290 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
352a0 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e  Used, sqlite3_in
352b0 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73  t64 *piNow){.  s
352c0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
352d0 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
352e0 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
352f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
35300 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20  40000;.  int rc 
35310 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66  = SQLITE_OK;.#if
35320 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54   defined(NO_GETT
35330 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a  OD).  time_t t;.
35340 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70    time(&t);.  *p
35350 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33  iNow = ((sqlite3
35360 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b  _int64)t)*1000 +
35370 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69   unixEpoch;.#eli
35380 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
35390 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
353a0 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74  Now;.  clock_get
353b0 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54  time(CLOCK_REALT
353c0 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a  IME, &sNow);.  *
353d0 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
353e0 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
353f0 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
35400 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73  sec + sNow.tv_ns
35410 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73  ec/1000000;.#els
35420 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
35430 61 6c 20 73 4e 6f 77 3b 0a 20 20 28 76 6f 69 64  al sNow;.  (void
35440 29 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73  )gettimeofday(&s
35450 4e 6f 77 2c 20 30 29 3b 20 20 2f 2a 20 43 61 6e  Now, 0);  /* Can
35460 6e 6f 74 20 66 61 69 6c 20 67 69 76 65 6e 20 76  not fail given v
35470 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  alid arguments *
35480 2f 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  /.  *piNow = uni
35490 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
354a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
354b0 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
354c0 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65  tv_usec/1000;.#e
354d0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
354e0 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
354f0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
35500 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
35510 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
35520 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
35530 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
35540 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
35550 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
35560 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
35570 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
35580 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
35590 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
355a0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
355b0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
355c0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
355d0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
355e0 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
355f0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
35600 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
35610 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
35620 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
35630 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
35640 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
35650 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
35660 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
35670 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
35680 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
35690 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
356a0 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69   *prNow){.  sqli
356b0 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b  te3_int64 i = 0;
356c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55  .  int rc;.  UNU
356d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
356e0 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75  tUsed);.  rc = u
356f0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
35700 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70  t64(0, &i);.  *p
35710 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
35720 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0.0;.  return rc
35730 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
35740 6e 65 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  ne unixCurrentTi
35750 6d 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  me 0.#endif../*.
35760 2a 2a 20 54 68 65 20 78 47 65 74 4c 61 73 74 45  ** The xGetLastE
35770 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 69 73  rror() method is
35780 20 64 65 73 69 67 6e 65 64 20 74 6f 20 72 65 74   designed to ret
35790 75 72 6e 20 61 20 62 65 74 74 65 72 0a 2a 2a 20  urn a better.** 
357a0 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
357b0 6d 65 73 73 61 67 65 20 77 68 65 6e 20 6f 70 65  message when ope
357c0 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72  rating-system pr
357d0 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a  oblems come up.*
357e0 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20  * during SQLite 
357f0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4f 6e 6c 79  operation.  Only
35800 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 65 74   the integer ret
35810 75 72 6e 20 63 6f 64 65 20 69 73 20 63 75 72 72  urn code is curr
35820 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 2e 0a 2a  ently.** used..*
35830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
35840 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
35850 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
35860 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
35870 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33  , char *NotUsed3
35880 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
35890 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
358a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
358b0 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  ER(NotUsed2);.  
358c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
358d0 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65  (NotUsed3);.  re
358e0 74 75 72 6e 20 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a  turn errno;.}...
358f0 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
35900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
35910 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  of sqlite3_vfs m
35920 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
35930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35940 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
35950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35990 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
359a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
359b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
359c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
359d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
359e0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
359f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
35a00 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69  egin Proxy Locki
35a10 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
35a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35a30 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ***.**.** Proxy 
35a40 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62  locking is a "ub
35a50 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f  er-locking-metho
35a60 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65  d" in this sense
35a70 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a  :  It uses the.*
35a80 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  * other locking 
35a90 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e  methods on secon
35aa0 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e  dary lock files.
35ab0 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20    Proxy locking 
35ac0 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79  is a.** meta-lay
35ad0 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74  er over top of t
35ae0 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
35af0 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64  king implemented
35b00 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20   above.  For.** 
35b10 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
35b20 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
35b30 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f  mplements of pro
35b40 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65  xy locking is de
35b50 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20  ferred.** until 
35b60 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65  late in the file
35b70 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c   (here) after al
35b80 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49  l of the other I
35b90 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a  /O methods have.
35ba0 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20  ** been defined 
35bb0 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72  - so that the pr
35bc0 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
35bd0 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69  methods are avai
35be0 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76  lable.** as serv
35bf0 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74  ices to help wit
35c00 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  h the implementa
35c10 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f  tion of proxy lo
35c20 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a  cking..**.****.*
35c30 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
35c40 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
35c50 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62   in SQLite use b
35c60 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
35c70 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
35c80 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64  se file to coord
35c90 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63  inate safe, conc
35ca0 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79  urrent access by
35cb0 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
35cc0 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73  s.** and writers
35cd0 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e   [http://sqlite.
35ce0 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74  org/lockingv3.ht
35cf0 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66  ml].  The five f
35d00 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  ile locking.** s
35d10 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c  tates (UNLOCKED,
35d20 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44   PENDING, SHARED
35d30 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c  , RESERVED, EXCL
35d40 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65  USIVE) are imple
35d50 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53  mented.** as POS
35d60 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20  IX read & write 
35d70 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64  locks over fixed
35d80 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e   set of location
35d90 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a  s (via fsctl),.*
35da0 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42  * on AFP and SMB
35db0 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20   only exclusive 
35dc0 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
35dd0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76   are available v
35de0 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68  ia fsctl.** with
35df0 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
35e00 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
35e10 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63  LockPB2) to trac
35e20 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61  k the same 5 sta
35e30 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c  tes..** To simul
35e40 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e  ate a F_RDLCK on
35e50 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
35e60 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64  e, on AFP a rand
35e70 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a  omly selected.**
35e80 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
35e90 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
35ea0 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52  taken for a SHAR
35eb0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74  ED lock, the ent
35ec0 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61  ire.** shared ra
35ed0 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
35ee0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
35ef0 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ck):.**.**      
35f00 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20  PENDING_BYTE    
35f10 20 20 20 20 30 78 34 30 30 30 30 30 30 30 0a 2a      0x40000000.*
35f20 2a 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f  *      RESERVED_
35f30 42 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30  BYTE       0x400
35f40 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48  00001.**      SH
35f50 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20  ARED_RANGE      
35f60 20 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20    0x40000002 -> 
35f70 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a  0x40000200.**.**
35f80 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c   This works well
35f90 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
35fa0 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73  le system, but s
35fb0 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30  hows a nearly 10
35fc0 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69  0x.** slowdown i
35fd0 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e  n read performan
35fe0 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73  ce on AFP becaus
35ff0 65 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74  e the AFP client
36000 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65   disables.** the
36010 20 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e   read cache when
36020 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
36030 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20  s are present.  
36040 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61  Enabling the rea
36050 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73  d.** cache expos
36060 65 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72  es a cache coher
36070 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61  ency problem tha
36080 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20  t is present on 
36090 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70  all OS X.** supp
360a0 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69  orted network fi
360b0 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53  le systems.  NFS
360c0 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62   and AFP both ob
360d0 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f  serve the.** clo
360e0 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e  se-to-open seman
360f0 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e  tics for ensurin
36100 67 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  g cache coherenc
36110 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73  y.** [http://nfs
36120 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  .sourceforge.net
36130 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68  /#faq_a8], which
36140 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74   does not effect
36150 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73  ively.** address
36160 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
36170 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74  s for concurrent
36180 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
36190 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20   by multiple.** 
361a0 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
361b0 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77  ers.** [http://w
361c0 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51  ww.nabble.com/SQ
361d0 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68  Lite-on-NFS-cach
361e0 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35  e-coherency-td15
361f0 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a  655701.html]..**
36200 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74  .** To address t
36210 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61  he performance a
36220 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e  nd cache coheren
36230 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79  cy issues, proxy
36240 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
36250 20 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79   changes the way
36260 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
36270 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62   is controlled b
36280 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73  y limiting acces
36290 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  s to a.** single
362a0 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20   host at a time 
362b0 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20  and moving file 
362c0 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65  locks off of the
362d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
362e0 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f  * and onto a pro
362f0 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c  xy file on the l
36300 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
36310 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69  .  .**.**.** Usi
36320 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a  ng proxy locks.*
36330 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
36340 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73  ---.**.** C APIs
36350 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  .**.**  sqlite3_
36360 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
36370 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
36380 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52  FCNTL_SET_LOCKPR
36390 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
363a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
363b0 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c    <proxy_path> |
363c0 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20   ":auto:");.**  
363d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
363e0 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
363f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45   SQLITE_FCNTL_GE
36400 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
36410 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
36420 20 20 20 20 20 20 20 20 20 20 26 3c 70 72 6f 78            &<prox
36430 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
36440 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
36450 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
36460 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
36470 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
36480 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
36490 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
364a0 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
364b0 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
364c0 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
364d0 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
364e0 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
364f0 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
36500 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
36510 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
36520 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
36530 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
36540 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
36550 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
36560 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
36570 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
36580 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
36590 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
365a0 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
365b0 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
365c0 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
365d0 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
365e0 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
365f0 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
36600 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
36610 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
36620 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
36630 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
36640 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
36650 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
36660 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
36670 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
36680 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
36690 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
366a0 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
366b0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
366c0 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
366d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
366e0 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
366f0 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
36700 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
36710 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
36720 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
36730 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
36740 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
36750 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
36760 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
36770 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
36780 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
36790 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
367a0 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
367b0 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
367c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
367d0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
367e0 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
367f0 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
36800 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
36810 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
36820 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
36830 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
36840 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
36850 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
36860 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
36870 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
36880 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
36890 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
368a0 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
368b0 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
368c0 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
368d0 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
368e0 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
368f0 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
36900 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
36910 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
36920 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
36930 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
36940 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
36950 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
36960 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
36970 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
36980 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
36990 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
369a0 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
369b0 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
369c0 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
369d0 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
369e0 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
369f0 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
36a00 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
36a10 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
36a20 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
36a30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36a40 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
36a50 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
36a60 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
36a70 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
36a80 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
36a90 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
36aa0 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
36ab0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
36ac0 2c 20 6f 72 20 69 74 73 20 63 6f 6e 74 65 6e 74  , or its content
36ad0 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  s do not match t
36ae0 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e  he.** host ID an
36af0 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c  d/or proxy path,
36b00 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69   then the lock i
36b10 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61  s escalated to a
36b20 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c  n exclusive.** l
36b30 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63  ock and the conc
36b40 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20  h file contents 
36b50 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20  is updated with 
36b60 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
36b70 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e  proxy.** path an
36b80 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f  d the lock is do
36b90 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68  wngraded to a sh
36ba0 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e  ared lock again.
36bb0 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a    If the conch.*
36bc0 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f  * is held by ano
36bd0 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69  ther process (wi
36be0 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  th a shared lock
36bf0 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ), the exclusive
36c00 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61   lock.** will fa
36c10 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55  il and SQLITE_BU
36c20 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
36c30 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  **.** The proxy 
36c40 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d  file - a single-
36c50 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66  byte file used f
36c60 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20  or all advisory 
36c70 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f  file locks.** no
36c80 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20  rmally taken on 
36c90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36ca0 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  e.   This allows
36cb0 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e   for safe sharin
36cc0 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  g.** of the data
36cd0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75  base file for mu
36ce0 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61  ltiple readers a
36cf0 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68  nd writers on th
36d00 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28  e same.** host (
36d10 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65  the conch ensure
36d20 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20  s that they all 
36d30 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63  use the same loc
36d40 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a  al lock file)..*
36d50 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20  *.** Requesting 
36d60 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64  the lock proxy d
36d70 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74  oes not immediat
36d80 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e  ely take the con
36d90 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c  ch, it is.** onl
36da0 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  y taken when the
36db0 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74   first request t
36dc0 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20  o lock database 
36dd0 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a  file is made.  .
36de0 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  ** This matches 
36df0 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66  the semantics of
36e00 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c   the traditional
36e10 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   locking behavio
36e20 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e  r, where.** open
36e30 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ing a connection
36e40 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
36e50 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b  ile does not tak
36e60 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a  e a lock on it..
36e70 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f  ** The shared lo
36e80 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66  ck and an open f
36e90 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
36ea0 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e  re maintained un
36eb0 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e  til .** the conn
36ec0 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61  ection to the da
36ed0 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64  tabase is closed
36ee0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  . .**.** The pro
36ef0 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  xy file and the 
36f00 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65  lock file are ne
36f10 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74  ver deleted so t
36f20 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a  hey only need.**
36f30 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74   to be created t
36f40 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
36f50 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a  ey are used..**.
36f60 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
36f70 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d   options.** ----
36f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f90 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  -.**.**  SQLITE_
36fa0 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
36fb0 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  KING.**.**      
36fc0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   Database files 
36fd0 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d  accessed on non-
36fe0 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
36ff0 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  ms are.**       
37000 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
37010 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f  nfigured for pro
37020 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b  xy locking, lock
37030 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20   files are.**   
37040 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61      named automa
37050 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68  tically using th
37060 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a  e same logic as.
37070 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  **       PRAGMA 
37080 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
37090 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a  ":auto:".**    .
370a0 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  **  SQLITE_PROXY
370b0 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20  _DEBUG.**.**    
370c0 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c     Enables the l
370d0 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20  ogging of error 
370e0 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20  messages during 
370f0 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20  host id file.** 
37100 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20        retrieval 
37110 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a  and creation.**.
37120 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  **  LOCKPROXYDIR
37130 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65  .**.**       Ove
37140 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75  rrides the defau
37150 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65  lt directory use
37160 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79  d for lock proxy
37170 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20   files that.**  
37180 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61       are named a
37190 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61  utomatically via
371a0 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65   the ":auto:" se
371b0 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  tting.**.**  SQL
371c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
371d0 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
371e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72  .**.**       Per
371f0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20  missions to use 
37200 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
37210 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74  directory for st
37220 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  oring the.**    
37230 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69     lock proxy fi
37240 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77  les, only used w
37250 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  hen LOCKPROXYDIR
37260 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20   is not set..** 
37270 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73     .**    .** As
37280 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65   mentioned above
37290 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  , when compiled 
372a0 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46  with SQLITE_PREF
372b0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
372c0 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65  ,.** setting the
372d0 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
372e0 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52  iable SQLITE_FOR
372f0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
37300 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f   to 1 will.** fo
37310 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  rce proxy lockin
37320 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  g to be used for
37330 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
37340 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64  file opened, and
37350 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65   0.** will force
37360 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79   automatic proxy
37370 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64   locking to be d
37380 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20  isabled for all 
37390 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
373a0 73 20 28 65 78 70 6c 69 63 69 74 6c 79 20 63 61  s (explicitly ca
373b0 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
373c0 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50  _FCNTL_SET_LOCKP
373d0 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20  ROXYFILE pragma 
373e0 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c  or.** sqlite_fil
373f0 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73  e_control API is
37400 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79   not affected by
37410 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
37420 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f  OXY_LOCKING)..*/
37430 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  ../*.** Proxy lo
37440 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
37450 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53  ailable on MacOS
37460 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  X .*/.#if define
37470 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
37480 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
37490 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a  CKING_STYLE../*.
374a0 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b  ** The proxyLock
374b0 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74  ingContext has t
374c0 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65  he path and file
374d0 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
374e0 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61  the remote .** a
374f0 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66  nd local proxy f
37500 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79  iles in it.*/.ty
37510 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f  pedef struct pro
37520 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
37530 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
37540 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f  text;.struct pro
37550 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
37560 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63   {.  unixFile *c
37570 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20  onchFile;       
37580 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20    /* Open conch 
37590 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
375a0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20  conchFilePath;  
375b0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
375c0 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
375d0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
375e0 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20  lockProxy;      
375f0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79     /* Open proxy
37600 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
37610 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50  char *lockProxyP
37620 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ath;         /* 
37630 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78  Name of the prox
37640 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
37650 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
37660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37670 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
37680 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  n file */.  int 
37690 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20  conchHeld;      
376a0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66           /* 1 if
376b0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65   the conch is he
376c0 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65  ld, -1 if lockle
376d0 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 61 69  ss */.  int nFai
376e0 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ls;             
376f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
37700 66 20 63 6f 6e 63 68 20 74 61 6b 69 6e 67 20 66  f conch taking f
37710 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69  ailures */.  voi
37720 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e  d *oldLockingCon
37730 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69  text;     /* Ori
37740 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e  ginal lockingcon
37750 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20  text to restore 
37760 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71  on close */.  sq
37770 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
37780 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68   const *pOldMeth
37790 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  od;     /* Origi
377a0 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  nal I/O methods 
377b0 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a  for close */.};.
377c0 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ./* .** The prox
377d0 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  y lock file path
377e0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
377f0 65 20 61 74 20 64 62 50 61 74 68 20 69 73 20 77  e at dbPath is w
37800 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74  ritten into lPat
37810 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73  h, .** which mus
37820 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64  t point to valid
37830 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  , writable memor
37840 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  y large enough f
37850 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67  or a maxLen leng
37860 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e  th.** file path.
37870 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
37880 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
37890 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50  (const char *dbP
378a0 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68  ath, char *lPath
378b0 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29  , size_t maxLen)
378c0 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69  {.  int len;.  i
378d0 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20  nt dbLen;.  int 
378e0 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50  i;..#ifdef LOCKP
378f0 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20  ROXYDIR.  len = 
37900 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c  strlcpy(lPath, L
37910 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78  OCKPROXYDIR, max
37920 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66  Len);.#else.# if
37930 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55  def _CS_DARWIN_U
37940 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b  SER_TEMP_DIR.  {
37950 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74  .    if( !confst
37960 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
37970 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74  R_TEMP_DIR, lPat
37980 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20  h, maxLen) ){.  
37990 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 47 45      OSTRACE(("GE
379a0 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65  TLOCKPATH  faile
379b0 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69  d %s errno=%d pi
379c0 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
379d0 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c 20 65          lPath, e
379e0 72 72 6e 6f 2c 20 6f 73 47 65 74 70 69 64 28 30  rrno, osGetpid(0
379f0 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
37a00 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
37a10 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  OCK;.    }.    l
37a20 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
37a30 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b  th, "sqliteplock
37a40 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20  s", maxLen);    
37a50 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65  .  }.# else.  le
37a60 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
37a70 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c  h, "/tmp/", maxL
37a80 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e  en);.# endif.#en
37a90 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68  dif..  if( lPath
37aa0 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a  [len-1]!='/' ){.
37ab0 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
37ac0 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61  t(lPath, "/", ma
37ad0 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  xLen);.  }.  .  
37ae0 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65  /* transform the
37af0 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e   db path to a un
37b00 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20  ique cache name 
37b10 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e  */.  dbLen = (in
37b20 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29  t)strlen(dbPath)
37b30 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c  ;.  for( i=0; i<
37b40 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b  dbLen && (i+len+
37b50 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20  7)<(int)maxLen; 
37b60 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63  i++){.    char c
37b70 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20   = dbPath[i];.  
37b80 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d    lPath[i+len] =
37b90 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b   (c=='/')?'_':c;
37ba0 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c  .  }.  lPath[i+l
37bb0 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c  en]='\0';.  strl
37bc0 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74  cat(lPath, ":aut
37bd0 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  o:", maxLen);.  
37be0 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
37bf0 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
37c00 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
37c10 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 6f 73 47 65  \n", lPath, osGe
37c20 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74  tpid(0)));.  ret
37c30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
37c40 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65  ../* . ** Create
37c50 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  s the lock file 
37c60 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20  and any missing 
37c70 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c  directories in l
37c80 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74  ockPath. */.stat
37c90 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
37ca0 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  teLockPath(const
37cb0 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29   char *lockPath)
37cc0 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a  {.  int i, len;.
37cd0 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41    char buf[MAXPA
37ce0 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74  THLEN];.  int st
37cf0 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73  art = 0;.  .  as
37d00 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e  sert(lockPath!=N
37d10 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74  ULL);.  /* try t
37d20 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65  o create all the
37d30 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69   intermediate di
37d40 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c  rectories */.  l
37d50 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
37d60 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75  (lockPath);.  bu
37d70 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[0] = lockPath[
37d80 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20  0];.  for( i=1; 
37d90 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20  i<len; i++ ){.  
37da0 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69    if( lockPath[i
37db0 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d  ] == '/' && (i -
37dc0 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20   start > 0) ){. 
37dd0 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64       /* only mkd
37de0 69 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21  ir if leaf dir !
37df0 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20  = "." or "/" or 
37e00 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66  ".." */.      if
37e10 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28  ( i-start>2 || (
37e20 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75  i-start==1 && bu
37e30 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
37e40 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
37e50 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20   '/') .         
37e60 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26  || (i-start==2 &
37e70 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
37e80 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
37e90 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20  +1] != '.') ){. 
37ea0 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c         buf[i]='\
37eb0 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0';.        if( 
37ec0 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c  osMkdir(buf, SQL
37ed0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
37ee0 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
37ef0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
37f00 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20  nt err=errno;.  
37f10 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21          if( err!
37f20 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20  =EEXIST ) {.    
37f30 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
37f40 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
37f50 20 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e    FAILED creatin
37f60 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20  g %s, ".        
37f70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25               "'%
37f80 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  s' proxy lock pa
37f90 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
37fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37fb0 20 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72        buf, strer
37fc0 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61  ror(err), lockPa
37fd0 74 68 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  th, osGetpid(0))
37fe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
37ff0 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20  eturn err;.     
38000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
38010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
38020 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a  tart=i+1;.    }.
38030 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63      buf[i] = loc
38040 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20  kPath[i];.  }.  
38050 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
38060 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
38070 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
38080 3d 25 64 5c 6e 22 2c 6c 6f 63 6b 50 61 74 68 2c  =%d\n",lockPath,
38090 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
380a0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
380b0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
380c0 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69   VFS file descri
380d0 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20  ptor (stored in 
380e0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
380f0 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  from.** sqlite3_
38100 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e  malloc) and open
38110 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20   the file named 
38120 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69  "path" in the fi
38130 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
38140 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
38150 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e  is responsible n
38160 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73  ot only for clos
38170 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73  ing the file des
38180 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61  criptor.** but a
38190 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20  lso for freeing 
381a0 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  the memory assoc
381b0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
381c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
381d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
381e0 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
381f0 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e(.    const cha
38200 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20  r *path,        
38210 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20  /* path for the 
38220 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a  new unixFile */.
38230 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70      unixFile **p
38240 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20  pFile,       /* 
38250 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64  unixFile created
38260 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79   and returned by
38270 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20   ref */.    int 
38280 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20  islockfile      
38290 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a       /* if non z
382a0 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73  ero missing dirs
382b0 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
382c0 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64   */.) {.  int fd
382d0 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c   = -1;.  unixFil
382e0 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  e *pNew;.  int r
382f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
38300 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
38310 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
38320 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  T;.  sqlite3_vfs
38330 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74   dummyVfs;.  int
38340 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55   terrno = 0;.  U
38350 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
38360 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  used = NULL;..  
38370 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20  /* 1. first try 
38380 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
38390 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20  he file.  ** 2. 
383a0 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61  if that fails, a
383b0 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63  nd this is a loc
383c0 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63  k file (not-conc
383d0 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67  h), try creating
383e0 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74  .  ** the parent
383f0 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64   directories and
38400 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e   then try again.
38410 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74  .  ** 3. if that
38420 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f   fails, try to o
38430 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61  pen the file rea
38440 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65  d-only.  ** othe
38450 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53  rwise return BUS
38460 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29  Y (if lock file)
38470 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72   or CANTOPEN for
38480 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a   the conch file.
38490 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d    */.  pUnused =
384a0 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
384b0 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29  path, openFlags)
384c0 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20  ;.  if( pUnused 
384d0 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75  ){.    fd = pUnu
384e0 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65  sed->fd;.  }else
384f0 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  {.    pUnused = 
38500 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
38510 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
38520 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e  ));.    if( !pUn
38530 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65  used ){.      re
38540 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
38550 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
38560 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
38570 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
38580 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
38590 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65  lags, 0);.    te
385a0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
385b0 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72