/ Hex Artifact Content
Login

Artifact 085352926299f5c5ced95c67bf6e4715f7989be0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0c80: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0c90: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0cb0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0cc0: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
0cd0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
0ce0: 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f  ) && ((__MAC_OS_
0cf0: 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
0d00: 51 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c  QUIRED > 1050) |
0d10: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0d30: 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53  __IPHONE_OS_VERS
0d40: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
0d50: 20 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20   > 2000)).#  if 
0d60: 28 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54  (!defined(TARGET
0d70: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c  _OS_EMBEDDED) ||
0d80: 20 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45   (TARGET_OS_EMBE
0d90: 44 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20  DDED==0)) \.    
0da0: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
0db0: 54 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49  TARGET_IPHONE_SI
0dc0: 4d 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52  MULATOR) || (TAR
0dd0: 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c  GET_IPHONE_SIMUL
0de0: 41 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64  ATOR==0)).#    d
0df0: 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f  efine HAVE_GETHO
0e00: 53 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65  STUUID 1.#  else
0e10: 0a 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67  .#    warning "g
0e20: 65 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20  ethostuuid() is 
0e30: 64 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e  disabled.".#  en
0e40: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  dif.#endif...#if
0e50: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e   OS_VXWORKS.# in
0e60: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
0e70: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0e80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e  emaphore.h>.# in
0e90: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0ea0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
0eb0: 57 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65  WORKS */..#if de
0ec0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0ed0: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
0ee0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
0ef0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
0f00: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
0f10: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
0f20: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
0f30: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
0f40: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0f50: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
0f60: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
0f70: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
0f80: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
0f90: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
0fa0: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
0fb0: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
0fc0: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
0fd0: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
0fe0: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
0ff0: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
1000: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1010: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
1020: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
1030: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
1040: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
1050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1060: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1070: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
1080: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
1090: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
10a0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
10b0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
10c0: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
10d0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
10e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
10f0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1100: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1110: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1120: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1130: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1140: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
1150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1160: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1170: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1190: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
11a0: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
11b0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
11c0: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 20 41 6c  HNAME 512../* Al
11d0: 77 61 79 73 20 63 61 73 74 20 74 68 65 20 67 65  ways cast the ge
11e0: 74 70 69 64 28 29 20 72 65 74 75 72 6e 20 74 79  tpid() return ty
11f0: 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  pe for compatibi
1200: 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72  lity with.** ker
1210: 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56  nel modules in V
1220: 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69  xWorks. */.#defi
1230: 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29 20 28  ne osGetpid(X) (
1240: 70 69 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a  pid_t)getpid()..
1250: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1260: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1270: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1280: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1290: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
12a0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
12b0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
12c0: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
12d0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
12e0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
12f0: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1300: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1310: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1320: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1330: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1340: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1350: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1360: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1370: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1380: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1390: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
13a0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
13b0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
13c0: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
13d0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
13e0: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
13f0: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1400: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1410: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1420: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1430: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1440: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1450: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1460: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1470: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
1480: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
1490: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
14a0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
14b0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
14c0: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
14d0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
14e0: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
14f0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1500: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1510: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1520: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1530: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1540: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1550: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1560: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1570: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
1580: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
15b0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
15c0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
15d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
15e0: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
15f0: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1600: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1610: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1620: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1630: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1640: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1650: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1660: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1670: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
1680: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
1690: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
16a0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
16b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
16c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16d0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
16e0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
16f0: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1700: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1710: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1720: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1730: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1740: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1770: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1780: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1790: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
17c0: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
17d0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1800: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1810: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1820: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1830: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1840: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1850: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1860: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1870: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1880: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1890: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
18a0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
18b0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
18e0: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
18f0: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1900: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1910: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1920: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1930: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1940: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1950: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1970: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1980: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
19a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
19d0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1a00: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1a10: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1a20: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a40: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1a50: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1a60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1a70: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1a80: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ab0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1ac0: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1ad0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ae0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1af0: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1b00: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1b10: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1b20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1b30: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1b40: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1b50: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1b60: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1b70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1b80: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1b90: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ba0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1bb0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1bc0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1bf0: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1c00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1c10: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1c20: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1c40: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1c50: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1c60: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1c80: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1c90: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1ca0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1cc0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1cd0: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1d00: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1d10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1d20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1d30: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1d40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1d50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1d60: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1d70: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1d80: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1d90: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1da0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1db0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1dc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1dd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1de0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1df0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1e00: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e10: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e20: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1e30: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1e40: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1e50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e60: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1e70: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1e80: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1e90: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1ea0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1eb0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1ec0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1ed0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1ee0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1ef0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f00: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f20: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1f30: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1f40: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1f50: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1f60: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1f70: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1f80: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
1f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fa0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
1fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1fd0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
1fe0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ff0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2000: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2010: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2020: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2040: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2050: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2060: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2070: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2080: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2090: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
20a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
20b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
20c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
20d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
20e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
20f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2100: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2110: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2120: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2130: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2140: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2150: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2160: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2170: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2180: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2190: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
21a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
21b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
21c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
21d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
21e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
21f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2200: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2210: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2220: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2230: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2240: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2250: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2260: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2270: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2280: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2290: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
22a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
22b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
22c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
22d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
22e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
22f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2300: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2310: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2320: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2330: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2340: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2350: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2360: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2370: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2380: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2390: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
23a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
23b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
23c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
23d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
23e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
23f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2400: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2410: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2420: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2430: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2440: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2450: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2460: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2470: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2480: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2490: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
24a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
24b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
24c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
24d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
24e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
24f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
2500: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
2510: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
2520: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
2530: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
2540: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2550: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2560: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
2570: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
2580: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
2590: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
25a0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
25b0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
25c0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
25d0: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
25e0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
25f0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2600: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
2610: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
2620: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
2630: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
2640: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2650: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2660: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61  ./*.** The threa
2670: 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76  did macro resolv
2680: 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  es to the thread
2690: 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73  -id or to 0.  Us
26a0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
26b0: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
26c0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  only..*/.#if SQL
26d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
26e0: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
26f0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
2700: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
2710: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
2720: 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41  /*.** HAVE_MREMA
2730: 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72  P defaults to tr
2740: 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20  ue on Linux and 
2750: 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72 65  false everywhere
2760: 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64   else..*/.#if !d
2770: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d  efined(HAVE_MREM
2780: 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64  AP).# if defined
2790: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64  (__linux__) && d
27a0: 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52  efined(_GNU_SOUR
27b0: 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41  CE).#  define HA
27c0: 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c  VE_MREMAP 1.# el
27d0: 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  se.#  define HAV
27e0: 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64  E_MREMAP 0.# end
27f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
2800: 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c   Explicitly call
2810: 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72 73   the 64-bit vers
2820: 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f  ion of lseek() o
2830: 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72  n Android. Other
2840: 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a  wise, lseek().**
2850: 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20 76   is the 32-bit v
2860: 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20  ersion, even if 
2870: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
2880: 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e  S=64 is defined.
2890: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  .*/.#ifdef __AND
28a0: 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20  ROID__.# define 
28b0: 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65  lseek lseek64.#e
28c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66  ndif../*.** Diff
28d0: 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65  erent Unix syste
28e0: 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28  ms declare open(
28f0: 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77  ) in different w
2900: 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a  ays.  Same use.*
2910: 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  * open(const cha
2920: 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20  r*,int,mode_t). 
2930: 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e   Others use open
2940: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2950: 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69  ,...)..** The di
2960: 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f  fference is impo
2970: 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67  rtant when using
2980: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2990: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  e function..**.*
29a0: 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61 79  * The safest way
29b0: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
29c0: 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20  e problem is to 
29d0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73 20  always use this 
29e0: 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68  wrapper.** which
29f0: 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20   always has the 
2a00: 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65  same well-define
2a10: 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  d interface..*/.
2a20: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
2a30: 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  Open(const char 
2a40: 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67  *zFile, int flag
2a50: 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20  s, int mode){.  
2a60: 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c  return open(zFil
2a70: 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b  e, flags, mode);
2a80: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
2a90: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
2aa0: 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
2ab0: 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a  tory(const char*
2ac0: 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  , int*);.static 
2ad0: 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65 73  int unixGetpages
2ae0: 69 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a  ize(void);../*.*
2af0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
2b00: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2b10: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2b20: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2b30: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2b40: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2b50: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2b60: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2b70: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2b80: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2b90: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2ba0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
2bb0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
2bc0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
2bd0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
2be0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
2bf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
2c00: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2c10: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2c20: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2c30: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2c40: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
2c50: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
2c60: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
2c70: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
2c80: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
2c90: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
2ca0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
2cb0: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
2cc0: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
2cd0: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20  scall[] = {.  { 
2ce0: 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20  "open",         
2cf0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2d00: 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20  _ptr)posixOpen, 
2d10: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2d20: 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74  sOpen      ((int
2d30: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
2d40: 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  int,int))aSyscal
2d50: 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[0].pCurrent)..
2d60: 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20    { "close",    
2d70: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2d80: 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20  call_ptr)close, 
2d90: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2da0: 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28  ne osClose     (
2db0: 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79  (int(*)(int))aSy
2dc0: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
2dd0: 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22  t)..  { "access"
2de0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
2df0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63  _syscall_ptr)acc
2e00: 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ess,     0  },.#
2e10: 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20  define osAccess 
2e20: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2e30: 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79  t char*,int))aSy
2e40: 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e  scall[2].pCurren
2e50: 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22  t)..  { "getcwd"
2e60: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
2e70: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74  _syscall_ptr)get
2e80: 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  cwd,     0  },.#
2e90: 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20  define osGetcwd 
2ea0: 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68     ((char*(*)(ch
2eb0: 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  ar*,size_t))aSys
2ec0: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
2ed0: 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20  )..  { "stat",  
2ee0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2ef0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74  syscall_ptr)stat
2f00: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2f10: 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20  efine osStat    
2f20: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2f30: 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74   char*,struct st
2f40: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d  at*))aSyscall[4]
2f50: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a  .pCurrent)../*.*
2f60: 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70  * The DJGPP comp
2f70: 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  iler environment
2f80: 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69   looks mostly li
2f90: 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a  ke Unix, but it.
2fa0: 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e  ** lacks the fcn
2fb0: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
2fc0: 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66  .  So redefine f
2fd0: 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d  cntl() to be som
2fe0: 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61  ething.** that a
2ff0: 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
3000: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
3010: 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f   locking does no
3020: 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a  t occur under.**
3030: 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20   DJGPP.  But it 
3040: 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69  is DOS - what di
3050: 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f  d you expect?.*/
3060: 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f  .#ifdef __DJGPP_
3070: 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20  _.  { "fstat",  
3080: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
3090: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
30a0: 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61  define osFstat(a
30b0: 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65  ,b,c)    0.#else
30c0: 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74       .  { "fstat
30d0: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
30e0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
30f0: 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c  stat,      0  },
3100: 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74  .#define osFstat
3110: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
3120: 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  t,struct stat*))
3130: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
3140: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20  rent).#endif..  
3150: 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20  { "ftruncate",  
3160: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3170: 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65  ll_ptr)ftruncate
3180: 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65  ,  0  },.#define
3190: 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69   osFtruncate ((i
31a0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29  nt(*)(int,off_t)
31b0: 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75  )aSyscall[6].pCu
31c0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e  rrent)..  { "fcn
31d0: 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  tl",        (sql
31e0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
31f0: 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20  )fcntl,      0  
3200: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e  },.#define osFcn
3210: 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  tl     ((int(*)(
3220: 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79  int,int,...))aSy
3230: 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e  scall[7].pCurren
3240: 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20  t)..  { "read", 
3250: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3260: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61  _syscall_ptr)rea
3270: 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  d,       0  },.#
3280: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20  define osRead   
3290: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
32a0: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
32b0: 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43  ))aSyscall[8].pC
32c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
32d0: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
32e0: 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
32f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
3300: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3310: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3320: 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20  all_ptr)pread,  
3330: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a      0  },.#else.
3340: 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20    { "pread",    
3350: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3360: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3370: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
3380: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61  f.#define osPrea
3390: 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28  d     ((ssize_t(
33a0: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
33b0: 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  e_t,off_t))aSysc
33c0: 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29  all[9].pCurrent)
33d0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
33e0: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22  E_PREAD64).  { "
33f0: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3400: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3410: 70 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20  ptr)pread64,    
3420: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3430: 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20  "pread64",      
3440: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3450: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3460: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3470: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20  efine osPread64 
3480: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3490: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
34a0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
34b0: 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  10].pCurrent).. 
34c0: 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20   { "write",     
34d0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
34e0: 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20  all_ptr)write,  
34f0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3500: 65 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28  e osWrite     ((
3510: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3520: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3530: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e  t))aSyscall[11].
3540: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3550: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3560: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
3570: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
3580: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
3590: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
35a0: 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65  scall_ptr)pwrite
35b0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  ,     0  },.#els
35c0: 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  e.  { "pwrite", 
35d0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
35e0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
35f0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3600: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77  dif.#define osPw
3610: 72 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f  rite    ((ssize_
3620: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3630: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
3640: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
3650: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
3660: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
3670: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
3680: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
3690: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
36a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
36b0: 74 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30  tr)pwrite64,   0
36c0: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
36d0: 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28  pwrite64",     (
36e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
36f0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3700: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3710: 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20  fine osPwrite64 
3720: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3730: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
3740: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20  ze_t,off_t))\.  
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70    aSyscall[13].p
3770: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
3780: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
3790: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
37a0: 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 20  tr)fchmod,      
37b0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
37c0: 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28  e osFchmod    ((
37d0: 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f  int(*)(int,mode_
37e0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  t))aSyscall[14].
37f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3800: 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
3810: 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
3820: 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
3830: 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  CATE.  { "falloc
3840: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
3850: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
3860: 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20  six_fallocate,  
3870: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3880: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3890: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
38a0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
38b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
38c0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c  f.#define osFall
38d0: 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ocate ((int(*)(i
38e0: 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29  nt,off_t,off_t))
38f0: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
3900: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c  rrent)..  { "unl
3910: 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ink",       (sql
3920: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3930: 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20  )unlink,        
3940: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3950: 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e  osUnlink    ((in
3960: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3970: 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70  ))aSyscall[16].p
3980: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f  Current)..  { "o
3990: 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20  penDirectory",  
39a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
39b0: 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63  ll_ptr)openDirec
39c0: 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tory,      0 },.
39d0: 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69  #define osOpenDi
39e0: 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29  rectory ((int(*)
39f0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
3a00: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e  *))aSyscall[17].
3a10: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3a20: 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20 28  mkdir",        (
3a30: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3a40: 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20 20  ptr)mkdir,      
3a50: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3a60: 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28 28  e osMkdir     ((
3a70: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3a80: 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63  r*,mode_t))aSysc
3a90: 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74  all[18].pCurrent
3aa0: 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c 20  )..  { "rmdir", 
3ab0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3ac0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69  syscall_ptr)rmdi
3ad0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  r,           0 }
3ae0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64 69  ,.#define osRmdi
3af0: 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  r     ((int(*)(c
3b00: 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73  onst char*))aSys
3b10: 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e  call[19].pCurren
3b20: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22  t)..  { "fchown"
3b30: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3b40: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
3b50: 6f 77 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20  own,          0 
3b60: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68  },.#define osFch
3b70: 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29 28  own    ((int(*)(
3b80: 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29  int,uid_t,gid_t)
3b90: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
3ba0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65  urrent)..  { "ge
3bb0: 74 65 75 69 64 22 2c 20 20 20 20 20 20 28 73 71  teuid",      (sq
3bc0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3bd0: 72 29 67 65 74 65 75 69 64 2c 20 20 20 20 20 20  r)geteuid,      
3be0: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3bf0: 6f 73 47 65 74 65 75 69 64 20 20 20 28 28 75 69  osGeteuid   ((ui
3c00: 64 5f 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79  d_t(*)(void))aSy
3c10: 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65  scall[21].pCurre
3c20: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
3c30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
3c40: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
3c50: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
3c60: 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20   "mmap",        
3c70: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3c80: 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20 20 20  l_ptr)mmap,     
3c90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3ca0: 65 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20  e.  { "mmap",   
3cb0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3cc0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3ce0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3cf0: 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a  osMmap ((void*(*
3d00: 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 69  )(void*,size_t,i
3d10: 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74  nt,int,int,off_t
3d20: 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70  ))aSyscall[22].p
3d30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
3d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
3d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
3d70: 30 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20  0.  { "munmap", 
3d80: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3d90: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61  yscall_ptr)munma
3da0: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
3db0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 75 6e 6d  .#else.  { "munm
3dc0: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
3dd0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3de0: 39 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9,              
3df0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
3e00: 65 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28  efine osMunmap (
3e10: 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c  (void*(*)(void*,
3e20: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
3e30: 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [23].pCurrent)..
3e40: 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  #if HAVE_MREMAP 
3e50: 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c  && (!defined(SQL
3e60: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
3e70: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
3e80: 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 6d 72  _SIZE>0).  { "mr
3e90: 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71  emap",       (sq
3ea0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3eb0: 72 29 6d 72 65 6d 61 70 2c 20 20 20 20 20 20 20  r)mremap,       
3ec0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3ed0: 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20  { "mremap",     
3ee0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3ef0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3f00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3f10: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72  dif.#define osMr
3f20: 65 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28  emap ((void*(*)(
3f30: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a  void*,size_t,siz
3f40: 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79  e_t,int,...))aSy
3f50: 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65  scall[24].pCurre
3f60: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
3f70: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
3f80: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
3f90: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
3fa0: 20 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20   "getpagesize", 
3fb0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3fc0: 6c 5f 70 74 72 29 75 6e 69 78 47 65 74 70 61 67  l_ptr)unixGetpag
3fd0: 65 73 69 7a 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  esize, 0 },.#els
3fe0: 65 0a 20 20 7b 20 22 67 65 74 70 61 67 65 73 69  e.  { "getpagesi
3ff0: 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33 5f 73  ze",  (sqlite3_s
4000: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
4010: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4020: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4030: 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28 28  osGetpagesize ((
4040: 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79  int(*)(void))aSy
4050: 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65  scall[25].pCurre
4060: 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 6c 69  nt)..  { "readli
4070: 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  nk",     (sqlite
4080: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65  3_syscall_ptr)re
4090: 61 64 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 30  adlink,        0
40a0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65   },.#define osRe
40b0: 61 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74  adlink ((ssize_t
40c0: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
40d0: 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53  char*,size_t))aS
40e0: 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72  yscall[26].pCurr
40f0: 65 6e 74 29 0a 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  ent)...}; /* End
4100: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
4110: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
4120: 73 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20  s */.../*.** On 
4130: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61  some systems, ca
4140: 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20  lls to fchown() 
4150: 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d  will trigger a m
4160: 65 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75  essage in a secu
4170: 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74  rity.** log if t
4180: 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f  hey come from no
4190: 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73  n-root processes
41a0: 2e 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c  .  So avoid call
41b0: 69 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a  ing fchown() if.
41c0: 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75  ** we are not ru
41d0: 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a  nning as root..*
41e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
41f0: 75 73 74 46 63 68 6f 77 6e 28 69 6e 74 20 66 64  ustFchown(int fd
4200: 2c 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64  , uid_t uid, gid
4210: 5f 74 20 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f  _t gid){.#if OS_
4220: 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e  VXWORKS.  return
4230: 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75   0;.#else.  retu
4240: 72 6e 20 6f 73 47 65 74 65 75 69 64 28 29 20 3f  rn osGeteuid() ?
4250: 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e 28 66 64   0 : osFchown(fd
4260: 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65 6e 64 69  ,uid,gid);.#endi
4270: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  f.}../*.** This 
4280: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
4290: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
42a0: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
42b0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
42c0: 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52  "unix" VFSes.  R
42d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
42e0: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
42f0: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
4300: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
4310: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
4320: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
4330: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
4340: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
4350: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
4360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4370: 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c  unixSetSystemCal
4380: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
4390: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
43a0: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
43b0: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
43c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
43d0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
43e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
43f0: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
4400: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
4410: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
4420: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
4430: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
4440: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
4450: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
4460: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
4470: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
4480: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
4490: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
44a0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
44b0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
44c0: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
44d0: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
44e0: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
44f0: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
4500: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
4510: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
4520: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
4530: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
4540: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
4550: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
4560: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
4570: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4580: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
4590: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
45a0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
45b0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
45c0: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
45d0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
45e0: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
45f0: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
4600: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
4610: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
4620: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
4630: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
4640: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
4650: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
4660: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
4670: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
4680: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4690: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
46a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
46b0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
46c0: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
46d0: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
46e0: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
46f0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4700: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
4710: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4720: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
4730: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
4740: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
4750: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4760: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
4770: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
4780: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
4790: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
47a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
47b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
47c0: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
47d0: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
47e0: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
47f0: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
4800: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
4810: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
4820: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
4830: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
4840: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
4850: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
4860: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
4870: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
4880: 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74  _ptr unixGetSyst
4890: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
48a0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
48b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
48c0: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
48d0: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
48e0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
48f0: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
4900: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
4910: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
4920: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
4930: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
4940: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
4950: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
4960: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
4970: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
4980: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4990: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
49a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
49b0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
49c0: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
49d0: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
49e0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
49f0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
4a00: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
4a10: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
4a20: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
4a30: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
4a40: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
4a50: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
4a60: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
4a70: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
4a80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
4a90: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
4aa0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
4ab0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4ac0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
4ad0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
4ae0: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
4af0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
4b00: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
4b10: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
4b20: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
4b30: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4b40: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4b50: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
4b60: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
4b70: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
4b80: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
4b90: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4ba0: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
4bb0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
4bc0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
4bd0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4be0: 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65 70 74 20  * Do not accept 
4bf0: 61 6e 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  any file descrip
4c00: 74 6f 72 20 6c 65 73 73 20 74 68 61 6e 20 74 68  tor less than th
4c10: 69 73 20 76 61 6c 75 65 2c 20 69 6e 20 6f 72 64  is value, in ord
4c20: 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 6f  er to avoid.** o
4c30: 70 65 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  pening database 
4c40: 66 69 6c 65 20 75 73 69 6e 67 20 66 69 6c 65 20  file using file 
4c50: 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74  descriptors that
4c60: 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79 20 75 73   are commonly us
4c70: 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74 61 6e 64  ed for .** stand
4c80: 61 72 64 20 69 6e 70 75 74 2c 20 6f 75 74 70 75  ard input, outpu
4c90: 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e 0a 2a 2f  t, and error..*/
4ca0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4cb0: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
4cc0: 43 52 49 50 54 4f 52 0a 23 20 64 65 66 69 6e 65  CRIPTOR.# define
4cd0: 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f   SQLITE_MINIMUM_
4ce0: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20  FILE_DESCRIPTOR 
4cf0: 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  3.#endif../*.** 
4d00: 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e 20 20  Invoke open().  
4d10: 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65 20 74  Do so multiple t
4d20: 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74 20 65  imes, until it e
4d30: 69 74 68 65 72 20 73 75 63 63 65 65 64 73 20 6f  ither succeeds o
4d40: 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f 72 20 73  r.** fails for s
4d50: 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68 65 72  ome reason other
4d60: 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a   than EINTR..**.
4d70: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 63  ** If the file c
4d80: 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22 6d 22  reation mode "m"
4d90: 20 69 73 20 30 20 74 68 65 6e 20 73 65 74 20 69   is 0 then set i
4da0: 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  t to the default
4db0: 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65 2e 20   for.** SQLite. 
4dc0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
4dd0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
4de0: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
4df0: 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34  (normally.** 064
4e00: 34 29 20 61 73 20 6d 6f 64 69 66 69 65 64 20 62  4) as modified b
4e10: 79 20 74 68 65 20 73 79 73 74 65 6d 20 75 6d 61  y the system uma
4e20: 73 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e 6f 74  sk.  If m is not
4e30: 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65   0, then.** make
4e40: 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69   the file creati
4e50: 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78 61 63 74  on mode be exact
4e60: 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20 74 68  ly m ignoring th
4e70: 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e umask..**.** T
4e80: 68 65 20 6d 20 70 61 72 61 6d 65 74 65 72 20 77  he m parameter w
4e90: 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  ill be non-zero 
4ea0: 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65 61 74 69  only when creati
4eb0: 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61  ng -wal, -journa
4ec0: 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d 20 66  l,.** and -shm f
4ed0: 69 6c 65 73 2e 20 20 57 65 20 77 61 6e 74 20 74  iles.  We want t
4ee0: 68 6f 73 65 20 66 69 6c 65 73 20 74 6f 20 68 61  hose files to ha
4ef0: 76 65 20 2a 65 78 61 63 74 6c 79 2a 20 74 68 65  ve *exactly* the
4f00: 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69 73 73   same.** permiss
4f10: 69 6f 6e 73 20 61 73 20 74 68 65 69 72 20 6f 72  ions as their or
4f20: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2c  iginal database,
4f30: 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20 62   unadulterated b
4f40: 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20  y the umask..** 
4f50: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 69 66 20  In that way, if 
4f60: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
4f70: 69 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f 72 20  is -rw-rw-rw or 
4f80: 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64 20 61  -rw-rw-r-, and a
4f90: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
4fa0: 63 72 61 73 68 65 73 20 61 6e 64 20 6c 65 61 76  crashes and leav
4fb0: 65 73 20 62 65 68 69 6e 64 20 68 6f 74 20 6a 6f  es behind hot jo
4fc0: 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61 6e 79  urnals, then any
4fd0: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74  .** process that
4fe0: 20 69 73 20 61 62 6c 65 20 74 6f 20 77 72 69 74   is able to writ
4ff0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
5000: 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20 61  e will also be a
5010: 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f 76 65  ble to.** recove
5020: 72 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  r the hot journa
5030: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
5040: 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f  t robust_open(co
5050: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
5060: 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20   f, mode_t m){. 
5070: 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f 64 65 5f   int fd;.  mode_
5080: 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20 3a 20 53  t m2 = m ? m : S
5090: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
50a0: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a  LE_PERMISSIONS;.
50b0: 20 20 77 68 69 6c 65 28 31 29 7b 0a 23 69 66 20    while(1){.#if 
50c0: 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45  defined(O_CLOEXE
50d0: 43 29 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70  C).    fd = osOp
50e0: 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45 58 45 43  en(z,f|O_CLOEXEC
50f0: 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ,m2);.#else.    
5100: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c  fd = osOpen(z,f,
5110: 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  m2);.#endif.    
5120: 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
5130: 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e    if( errno==EIN
5140: 54 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TR ) continue;. 
5150: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5160: 7d 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 53 51  }.    if( fd>=SQ
5170: 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c  LITE_MINIMUM_FIL
5180: 45 5f 44 45 53 43 52 49 50 54 4f 52 20 29 20 62  E_DESCRIPTOR ) b
5190: 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  reak;.    osClos
51a0: 65 28 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(fd);.    sqlit
51b0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
51c0: 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20 20 20 20  RNING, .        
51d0: 20 20 20 20 20 20 20 20 22 61 74 74 65 6d 70 74          "attempt
51e0: 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20   to open \"%s\" 
51f0: 61 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  as file descript
5200: 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64 29 3b 0a  or %d", z, fd);.
5210: 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a 20 20 20      fd = -1;.   
5220: 20 69 66 28 20 6f 73 4f 70 65 6e 28 22 2f 64 65   if( osOpen("/de
5230: 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d 29 3c 30  v/null", f, m)<0
5240: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5250: 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
5260: 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20   if( m!=0 ){.   
5270: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
5280: 74 61 74 62 75 66 3b 0a 20 20 20 20 20 20 69 66  tatbuf;.      if
5290: 28 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  ( osFstat(fd, &s
52a0: 74 61 74 62 75 66 29 3d 3d 30 20 0a 20 20 20 20  tatbuf)==0 .    
52b0: 20 20 20 26 26 20 73 74 61 74 62 75 66 2e 73 74     && statbuf.st
52c0: 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20 20 20 20  _size==0.       
52d0: 26 26 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  && (statbuf.st_m
52e0: 6f 64 65 26 30 37 37 37 29 21 3d 6d 20 0a 20 20  ode&0777)!=m .  
52f0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f      ){.        o
5300: 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d 29 3b 0a  sFchmod(fd, m);.
5310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
5320: 66 20 64 65 66 69 6e 65 64 28 46 44 5f 43 4c 4f  f defined(FD_CLO
5330: 45 58 45 43 29 20 26 26 20 28 21 64 65 66 69 6e  EXEC) && (!defin
5340: 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 20 7c 7c  ed(O_CLOEXEC) ||
5350: 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30 29 0a 20   O_CLOEXEC==0). 
5360: 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46     osFcntl(fd, F
5370: 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
5380: 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
5390: 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
53a0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
53b0: 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn fd;.}../*.** 
53c0: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
53d0: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
53e0: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
53f0: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
5400: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
5410: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
5420: 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ct the unixInode
5430: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
5440: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
5450: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
5460: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
5470: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
5480: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
5490: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
54a0: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
54b0: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
54c0: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
54d0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
54e0: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
54f0: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
5500: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
5510: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
5520: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
5530: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
5540: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
5550: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
5560: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
5570: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
5580: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
5590: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
55a0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
55b0: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
55c0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
55d0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
55e0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
55f0: 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 73 74 61  IC_VFS1));.}.sta
5600: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61  tic void unixLea
5610: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
5620: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
5630: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
5640: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
5650: 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29  TEX_STATIC_VFS1)
5660: 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
5670: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
5680: 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  int unixMutexHel
5690: 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
56a0: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
56b0: 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
56c0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
56d0: 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
56e0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  ));.}.#endif...#
56f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
5700: 45 5f 4f 53 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  E_OS_TRACE./*.**
5710: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
5720: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
5730: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
5740: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
5750: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
5760: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
5770: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
5780: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
5790: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
57a0: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
57b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
57c0: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
57d0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
57e0: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
57f0: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
5800: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
5810: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
5820: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
5830: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
5840: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
5850: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
5860: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
5870: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
5880: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
5890: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
58a0: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
58b0: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
58c0: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
58d0: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
58e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
58f0: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
5900: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
5910: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
5920: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
5930: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5940: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
5950: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
5960: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
5970: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
5980: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
5990: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
59a0: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
59b0: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
59c0: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
59d0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
59e0: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
59f0: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
5a00: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
5a10: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
5a20: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
5a30: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
5a40: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
5a50: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
5a60: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
5a70: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
5a80: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
5a90: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
5aa0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
5ab0: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
5ac0: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
5ad0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
5ae0: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
5af0: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
5b00: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
5b10: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
5b20: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
5b30: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
5b40: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
5b50: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
5b60: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
5b70: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
5b80: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
5b90: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
5ba0: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
5bb0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
5bc0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
5bd0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
5be0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
5bf0: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
5c00: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
5c10: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
5c20: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46  SET );.  s = osF
5c30: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
5c40: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
5c50: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
5c60: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
5c70: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
5c80: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
5c90: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
5ca0: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
5cb0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
5cc0: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
5cd0: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
5ce0: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
5cf0: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
5d00: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
5d10: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
5d20: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
5d30: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
5d40: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
5d50: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73   l2 = *p;.    os
5d60: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  Fcntl(fd, F_GETL
5d70: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
5d80: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
5d90: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
5da0: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
5db0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
5dc0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
5dd0: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
5de0: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
5df0: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
5e00: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
5e10: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
5e20: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
5e30: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
5e40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5e50: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5e60: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
5e70: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
5e80: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
5e90: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
5ea0: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
5eb0: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
5ec0: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
5ed0: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
5ee0: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64  return s;.}.#und
5ef0: 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69  ef osFcntl.#defi
5f00: 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54  ne osFcntl lockT
5f10: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
5f20: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5f30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79   */../*.** Retry
5f40: 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c   ftruncate() cal
5f50: 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65  ls that fail due
5f60: 20 74 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20   to EINTR.**.** 
5f70: 41 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74 72  All calls to ftr
5f80: 75 6e 63 61 74 65 28 29 20 77 69 74 68 69 6e 20  uncate() within 
5f90: 74 68 69 73 20 66 69 6c 65 20 73 68 6f 75 6c 64  this file should
5fa0: 20 62 65 20 6d 61 64 65 20 74 68 72 6f 75 67 68   be made through
5fb0: 0a 2a 2a 20 74 68 69 73 20 77 72 61 70 70 65 72  .** this wrapper
5fc0: 2e 20 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69  .  On the Androi
5fd0: 64 20 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61  d platform, bypa
5fe0: 73 73 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20  ssing the logic 
5ff0: 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c  below.** could l
6000: 65 61 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74  ead to a corrupt
6010: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
6020: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
6030: 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c  ftruncate(int h,
6040: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
6050: 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69  z){.  int rc;.#i
6060: 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f  fdef __ANDROID__
6070: 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64  .  /* On Android
6080: 2c 20 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c  , ftruncate() al
6090: 77 61 79 73 20 75 73 65 73 20 33 32 2d 62 69 74  ways uses 32-bit
60a0: 20 6f 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69   offsets, even i
60b0: 66 20 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46  f .  ** _FILE_OF
60c0: 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20  FSET_BITS=64 is 
60d0: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65  defined. This me
60e0: 61 6e 73 20 69 74 20 69 73 20 75 6e 73 61 66 65  ans it is unsafe
60f0: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20   to attempt to. 
6100: 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66   ** truncate a f
6110: 69 6c 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20  ile to any size 
6120: 6c 61 72 67 65 72 20 74 68 61 6e 20 32 47 69 42  larger than 2GiB
6130: 2e 20 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72  . Silently ignor
6140: 65 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  e any.  ** such 
6150: 61 74 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20  attempts.  */.  
6160: 69 66 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f  if( sz>(sqlite3_
6170: 69 6e 74 36 34 29 30 78 37 46 46 46 46 46 46 46  int64)0x7FFFFFFF
6180: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
6190: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a  ITE_OK;.  }else.
61a0: 23 65 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20  #endif.  do{ rc 
61b0: 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c  = osFtruncate(h,
61c0: 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  sz); }while( rc<
61d0: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
61e0: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
61f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6200: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
6210: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
6220: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
6230: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
6240: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
6250: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
6260: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
6270: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
6280: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
6290: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
62a0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
62b0: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
62c0: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
62d0: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
62e0: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
62f0: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
6300: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
6310: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
6320: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
6330: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
6340: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
6350: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
6360: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
6370: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
6380: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
6390: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
63a0: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
63b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
63c0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
63d0: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
63e0: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
63f0: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 61 73  iteIOErr) {.  as
6400: 73 65 72 74 28 20 28 73 71 6c 69 74 65 49 4f 45  sert( (sqliteIOE
6410: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
6420: 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  RR_LOCK) || .   
6430: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
6440: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6450: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
6460: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
6470: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6480: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c  _IOERR_RDLOCK) |
6490: 7c 0a 20 20 20 20 20 20 20 20 20 20 28 73 71 6c  |.          (sql
64a0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
64b0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
64c0: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 3b 0a 20  SERVEDLOCK) );. 
64d0: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
64e0: 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 45 41  ror) {.  case EA
64f0: 43 43 45 53 3a 20 0a 20 20 63 61 73 65 20 45 41  CCES: .  case EA
6500: 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49  GAIN:.  case ETI
6510: 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45  MEDOUT:.  case E
6520: 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e  BUSY:.  case EIN
6530: 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43  TR:.  case ENOLC
6540: 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64  K:  .    /* rand
6550: 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72 72  om NFS retry err
6560: 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  or, unless durin
6570: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
6580: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
6590: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
65a0: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
65b0: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
65c0: 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  says */.    retu
65d0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
65e0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 50 45 52      .  case EPER
65f0: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
6600: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
6610: 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20  .  default: .   
6620: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f   return sqliteIO
6630: 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a  Err;.  }.}.../**
6640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
6690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
66a0: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
66b0: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
66c0: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
66d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
66e0: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
66f0: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
6700: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
6710: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
6720: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
6730: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
6740: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
6750: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
6760: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
6770: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
6780: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
6790: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
67a0: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
67b0: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
67c0: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
67d0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
67e0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
67f0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
6800: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
6810: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
6820: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
6830: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
6840: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
6850: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
6860: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
6870: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
6880: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
6890: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
68a0: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
68b0: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
68c0: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
68d0: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
68e0: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
68f0: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
6900: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
6910: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
6920: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
6930: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
6940: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
6950: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
6960: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
6970: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
6980: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
6990: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
69a0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
69b0: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
69c0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
69d0: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
69e0: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
69f0: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
6a00: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6a20: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
6a30: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
6a40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
6a70: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
6a80: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
6a90: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
6aa0: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
6ab0: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
6ac0: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
6ad0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
6ae0: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
6af0: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
6b00: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
6b10: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
6b20: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
6b30: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
6b40: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
6b50: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
6b60: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
6b70: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
6b80: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
6b90: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
6ba0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
6bb0: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
6bc0: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
6bd0: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
6be0: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
6bf0: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
6c00: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
6c10: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
6c20: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
6c30: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
6c40: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
6c50: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
6c60: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
6c70: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
6c80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
6c90: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
6ca0: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
6cb0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
6cc0: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
6cd0: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
6ce0: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
6cf0: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
6d00: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
6d10: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
6d20: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
6d30: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
6d40: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
6d50: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
6d60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
6d70: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
6d80: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
6d90: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
6da0: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6db0: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
6dc0: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
6dd0: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
6de0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6df0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6e00: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
6e10: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
6e20: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
6e30: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
6e40: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
6e50: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
6e60: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
6e70: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
6e80: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
6e90: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6ea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6eb0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
6ec0: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
6ed0: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
6ee0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
6ef0: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
6f00: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
6f10: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
6f20: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
6f30: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
6f40: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
6f50: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
6f60: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
6f70: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
6f80: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
6f90: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
6fa0: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
6fb0: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
6fc0: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
6fd0: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
6fe0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
6ff0: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
7000: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
7010: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
7020: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
7030: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
7040: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
7050: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
7060: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
7070: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
7080: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
7090: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
70a0: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
70b0: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
70c0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
70d0: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
70e0: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
70f0: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
7100: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7110: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
7120: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
7130: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
7140: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
7150: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
7180: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
7190: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
71a0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
71b0: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
71c0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
71d0: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
71e0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
71f0: 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
7200: 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a  New) + (n+1) );.
7210: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7220: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7230: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
7240: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
7250: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
7260: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7270: 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  e, zAbsoluteName
7280: 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78  , n+1);.  n = vx
7290: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
72a0: 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  e(pNew->zCanonic
72b0: 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f  alName, n);..  /
72c0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
72d0: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74  existing entry t
72e0: 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65  hat matching the
72f0: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e   canonical name.
7300: 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20  .  ** If found, 
7310: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
7320: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
7330: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
7340: 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  er to.  ** the e
7350: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e  xisting file ID.
7360: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
7370: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
7380: 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72  pCandidate=vxwor
7390: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e  ksFileList; pCan
73a0: 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61  didate; pCandida
73b0: 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70  te=pCandidate->p
73c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
73d0: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65  Candidate->nName
73e0: 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d  ==n .     && mem
73f0: 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e  cmp(pCandidate->
7400: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7410: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7420: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  Name, n)==0.    
7430: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
7440: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
7450: 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d       pCandidate-
7460: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
7470: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
7480: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
7490: 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20  pCandidate;.    
74a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  }.  }..  /* No m
74b0: 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20  atch was found. 
74c0: 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20   We will make a 
74d0: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
74e0: 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
74f0: 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d  .  pNew->nName =
7500: 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   n;.  pNew->pNex
7510: 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  t = vxworksFileL
7520: 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69  ist;.  vxworksFi
7530: 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  leList = pNew;. 
7540: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
7550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
7560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
7570: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
7580: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78  ce count on a vx
7590: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
75a0: 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65  ct.  Free.** the
75b0: 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65   object when the
75c0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
75d0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a   reaches zero..*
75e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78  /.static void vx
75f0: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
7600: 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b  Id(struct vxwork
7610: 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20  sFileId *pId){. 
7620: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
7630: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
7640: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49  ->nRef>0 );.  pI
7650: 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  d->nRef--;.  if(
7660: 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pId->nRef==0 ){
7670: 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f  .    struct vxwo
7680: 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a  rksFileId **pp;.
7690: 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f      for(pp=&vxwo
76a0: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70  rksFileList; *pp
76b0: 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70   && *pp!=pId; pp
76c0: 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
76d0: 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74  t)){}.    assert
76e0: 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20  ( *pp==pId );.  
76f0: 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65    *pp = pId->pNe
7700: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
7710: 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20  free(pId);.  }. 
7720: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
7730: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  );.}.#endif /* O
7740: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a  S_VXWORKS */./**
7750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
7760: 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65  d of Unique File
7770: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
7780: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
7790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78  ********** Posix
7860: 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
7870: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
7880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7890: 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73  *.** POSIX advis
78a0: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72  ory locks are br
78b0: 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20  oken by design. 
78c0: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
78d0: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
78e0: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
78f0: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
7900: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
7910: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
7920: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
7930: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
7940: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
7950: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
7960: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
7970: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
7980: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
7990: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
79a0: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
79b0: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
79c0: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
79d0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
79e0: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
79f0: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
7a00: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
7a10: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
7a20: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
7a30: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
7a40: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
7a50: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
7a60: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
7a70: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
7a80: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
7a90: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
7aa0: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
7ab0: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
7ac0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
7ad0: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
7ae0: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
7af0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
7b00: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
7b10: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
7b20: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
7b30: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
7b40: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
7b50: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
7b60: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
7b70: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
7b80: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
7b90: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
7ba0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
7bb0: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
7bc0: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
7bd0: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
7be0: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
7bf0: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
7c00: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
7c10: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
7c20: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
7c30: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
7c40: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
7c50: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7c60: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
7c70: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
7c80: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
7c90: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
7ca0: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
7cb0: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
7cc0: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
7cd0: 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f  le access.** amo
7ce0: 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ng competing thr
7cf0: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
7d00: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
7d10: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
7d20: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
7d30: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
7d40: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
7d50: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
7d60: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
7d70: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
7d80: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
7d90: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
7da0: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
7db0: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
7dc0: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
7dd0: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
7de0: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
7df0: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
7e00: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
7e10: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
7e20: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
7e30: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
7e40: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
7e50: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
7e60: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
7e70: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
7e80: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
7e90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7ea0: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
7eb0: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
7ec0: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
7ed0: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
7ee0: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
7ef0: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
7f00: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
7f10: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
7f20: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
7f30: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
7f40: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
7f50: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
7f60: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
7f70: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
7f80: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
7f90: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64  ode..**.** (Asid
7fa0: 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e  e: The use of in
7fb0: 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75  ode numbers as u
7fc0: 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e  nique IDs does n
7fd0: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
7fe0: 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72  ks..** For VxWor
7ff0: 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75  ks, we have to u
8000: 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69  se the alternati
8010: 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73  ve unique ID sys
8020: 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  tem based on.** 
8030: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
8040: 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  me and implement
8050: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
8060: 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a  us division.).**
8070: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
8080: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
8090: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
80a0: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
80b0: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
80c0: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
80d0: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
80e0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
80f0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
8100: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
8110: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
8120: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
8130: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
8140: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
8150: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
8160: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
8170: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
8180: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
8190: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
81a0: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
81b0: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
81c0: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
81d0: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
81e0: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
81f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
8200: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
8210: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
8220: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
8230: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
8240: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
8250: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
8260: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
8270: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
8280: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
8290: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
82a0: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
82b0: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
82c0: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
82d0: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
82e0: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
82f0: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
8300: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
8310: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
8320: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
8330: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
8340: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
8350: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
8360: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
8370: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
8380: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
8390: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
83a0: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
83b0: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
83c0: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
83d0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
83e0: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
83f0: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
8400: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  state..**.** But
8410: 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72   wait:  there ar
8420: 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c  e yet more probl
8430: 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61  ems with POSIX a
8440: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a  dvisory locks..*
8450: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
8460: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
8470: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
8480: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
8490: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
84a0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
84b0: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
84c0: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
84d0: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
84e0: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
84f0: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
8500: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
8510: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8520: 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20  ct.** maintains 
8530: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
8540: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
8550: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e   locks on tha in
8560: 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20  ode..** When an 
8570: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
8580: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
8590: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
85a0: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
85b0: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
85c0: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
85d0: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
85e0: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
85f0: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
8600: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
8610: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
8620: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
8630: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
8640: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
8650: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20  ructure keeps a 
8660: 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73  list of file des
8670: 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65  criptors that ne
8680: 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73  ed to.** be clos
8690: 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74  ed and that list
86a0: 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20   is walked (and 
86b0: 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68  cleared) when th
86c0: 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63  e last lock.** c
86d0: 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74  lears..**.** Yet
86e0: 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d   another problem
86f0: 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  :  LinuxThreads 
8700: 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c  do not play well
8710: 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b   with posix lock
8720: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c  s..**.** Many ol
8730: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
8740: 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69  linux use the Li
8750: 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61  nuxThreads libra
8760: 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e  ry which is.** n
8770: 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61  ot posix complia
8780: 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78  nt.  Under Linux
8790: 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20  Threads, a lock 
87a0: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
87b0: 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65  d.** A cannot be
87c0: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65   modified or ove
87d0: 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66  rridden by a dif
87e0: 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e  ferent thread B.
87f0: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20  .** Only thread 
8800: 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65  A can modify the
8810: 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20   lock.  Locking 
8820: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
8830: 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70  ect.** if the ap
8840: 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68  pliation uses th
8850: 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50  e newer Native P
8860: 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72  osix Thread Libr
8870: 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e  ary (NPTL).** on
8880: 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50   linux - with NP
8890: 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  TL a lock create
88a0: 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61  d by thread A ca
88b0: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
88c0: 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e  .** in thread B.
88d0: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e    But there is n
88e0: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
88f0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
8900: 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67  ich.** threading
8910: 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e   library is bein
8920: 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72  g used.  So ther
8930: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
8940: 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c  now at.** compil
8950: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
8960: 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63  r not thread A c
8970: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
8980: 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a  s on thread B..*
8990: 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  * One has to do 
89a0: 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b  a run-time check
89b0: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
89c0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
89d0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63  .** current proc
89e0: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ess..**.** SQLit
89f0: 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72  e used to suppor
8a00: 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20  t LinuxThreads. 
8a10: 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72   But support for
8a20: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a   LinuxThreads.**
8a30: 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67   was dropped beg
8a40: 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73  inning with vers
8a50: 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69  ion 3.7.0.  SQLi
8a60: 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  te will still wo
8a70: 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78  rk with.** Linux
8a80: 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64  Threads provided
8a90: 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20   that (1) there 
8aa0: 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  is no more than 
8ab0: 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  one connection .
8ac0: 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20  ** per database 
8ad0: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
8ae0: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29   process and (2)
8af0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8b00: 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  tions.** do not 
8b10: 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65  move across thre
8b20: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ads..*/../*.** A
8b30: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8b40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
8b50: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
8b60: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
8b70: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
8b80: 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65  icular unixInode
8b90: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
8ba0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
8bb0: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
8be0: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
8bf0: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
8c00: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
8c10: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
8c20: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
8c30: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
8c40: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
8c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
8c60: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
8c70: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
8c80: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
8c90: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
8ca0: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
8cb0: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
8cc0: 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e  * inode.  Or, on
8cd0: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74   LinuxThreads, t
8ce0: 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74  here is one of t
8cf0: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
8d00: 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64  for.** each inod
8d10: 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68  e opened by each
8d20: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41   thread..**.** A
8d30: 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61   single inode ca
8d40: 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
8d50: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8d60: 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69  , so each unixFi
8d70: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
8d80: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
8d90: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
8da0: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
8db0: 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a   and this.** obj
8dc0: 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e  ect keeps a coun
8dd0: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
8de0: 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e  of unixFile poin
8df0: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  ting to it..*/.s
8e00: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
8e10: 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75  nfo {.  struct u
8e20: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
8e30: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ;       /* The l
8e40: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
8e50: 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20  nt nShared;     
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8e70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52  * Number of SHAR
8e80: 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ED locks held */
8e90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8ea0: 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20   eFileLock;     
8eb0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41     /* One of SHA
8ec0: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
8ed0: 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a  ED_LOCK etc. */.
8ee0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8ef0: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20  bProcessLock;   
8f00: 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76    /* An exclusiv
8f10: 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69  e process lock i
8f20: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
8f30: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8f50: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
8f60: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
8f70: 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ure */.  unixShm
8f80: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
8f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
8fa0: 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
8fb0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
8fc0: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  node */.  int nL
8fd0: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
8fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8ff0: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
9000: 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f  ng file locks */
9010: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
9020: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
9030: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
9040: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
9050: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78   close */.  unix
9060: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74  InodeInfo *pNext
9070: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
9080: 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  ist of all unixI
9090: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
90a0: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
90b0: 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20  nfo *pPrev;     
90c0: 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e        /*    ....
90d0: 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a   doubly linked *
90e0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
90f0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
9100: 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  E.  unsigned lon
9110: 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74  g long sharedByt
9120: 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73  e;  /* for AFP s
9130: 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20  imulated shared 
9140: 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  lock */.#endif.#
9150: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
9160: 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20  sem_t *pSem;    
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73  /* Named POSIX s
9190: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68  emaphore */.  ch
91a0: 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f  ar aSemName[MAX_
91b0: 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a  PATHNAME+2];  /*
91c0: 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65   Name of that se
91d0: 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69  maphore */.#endi
91e0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  f.};../*.** A li
91f0: 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  sts of all unixI
9200: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
9210: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78  ..*/.static unix
9220: 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65  InodeInfo *inode
9230: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
9240: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9250: 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  n - unixLogError
9260: 41 74 4c 69 6e 65 28 29 2c 20 69 73 20 6f 6e 6c  AtLine(), is onl
9270: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
9280: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75  a the macro.** u
9290: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  nixLogError()..*
92a0: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b  *.** It is invok
92b0: 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ed after an erro
92c0: 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f  r occurs in an O
92d0: 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65  S function and e
92e0: 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a  rrno has been.**
92f0: 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20   set. It logs a 
9300: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
9310: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
9320: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
9330: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
9340: 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73  rrno and, if pos
9350: 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e  sible, the human
9360: 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61  -readable equiva
9370: 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72  lent from strerr
9380: 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72  or() or.** strer
9390: 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ror_r()..**.** T
93a0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
93b0: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
93c0: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
93d0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
93e0: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
93f0: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
9400: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
9410: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
9420: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a  ITE_CANTOPEN). .
9430: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
9440: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
9450: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
9460: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
9470: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
9480: 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69  iled (e.g. "unli
9490: 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64  nk", "open") and
94a0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
94b0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
94c0: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ,.** if any..*/.
94d0: 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45  #define unixLogE
94e0: 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20  rror(a,b,c)     
94f0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
9500: 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f  ne(a,b,c,__LINE_
9510: 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  _).static int un
9520: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
9530: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
9560: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  ror code */.  co
9570: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9590: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
95a0: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
95b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
95c0: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
95d0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
95e0: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
95f0: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
9600: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9620: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
9630: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
9640: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
9650: 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20   char *zErr;    
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d   /* Message from
9680: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65   strerror() or e
9690: 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69  quivalent */.  i
96a0: 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt iErrno = errn
96b0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  o;             /
96c0: 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20  * Saved syscall 
96d0: 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  error number */.
96e0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
96f0: 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61 66   not a threadsaf
9700: 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f  e build (SQLITE_
9710: 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20  THREADSAFE==0), 
9720: 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68  then use.  ** th
9730: 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e  e strerror() fun
9740: 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
9750: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
9760: 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
9770: 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  .  ** equivalent
9780: 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72   to errno. Other
9790: 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72 72  wise, use strerr
97a0: 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69  or_r()..  */ .#i
97b0: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
97c0: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 48  AFE && defined(H
97d0: 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a  AVE_STRERROR_R).
97e0: 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b    char aErr[80];
97f0: 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20  .  memset(aErr, 
9800: 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29  0, sizeof(aErr))
9810: 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b  ;.  zErr = aErr;
9820: 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52  ..  /* If STRERR
9830: 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74  OR_R_CHAR_P (set
9840: 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72   by autoconf scr
9850: 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47  ipts) or __USE_G
9860: 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20  NU is defined,. 
9870: 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
9880: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
9890: 64 65 73 20 74 68 65 20 47 4e 55 20 76 65 72 73  des the GNU vers
98a0: 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f  ion of strerror_
98b0: 72 28 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  r() that.  ** re
98c0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
98d0: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
98e0: 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72  aining the error
98f0: 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70   message. That p
9900: 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79  ointer .  ** may
9910: 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d   point to aErr[]
9920: 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e  , or it may poin
9930: 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63  t to some static
9940: 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65   storage somewhe
9950: 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  re. .  ** Otherw
9960: 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ise, assume that
9970: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
9980: 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76  ides the POSIX v
9990: 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20  ersion of .  ** 
99a0: 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68  strerror_r(), wh
99b0: 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65  ich always write
99c0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
99d0: 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a  ge into aErr[]..
99e0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
99f0: 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c   code incorrectl
9a00: 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  y assumes that i
9a10: 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76  t is the POSIX v
9a20: 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20  ersion that is. 
9a30: 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74   ** available, t
9a40: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
9a50: 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61   will often be a
9a60: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
9a70: 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20  Not a.  ** huge 
9a80: 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65  problem. Incorre
9a90: 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20  ctly concluding 
9aa0: 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72  that the GNU ver
9ab0: 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
9ac0: 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65  e .  ** could le
9ad0: 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74  ad to a segfault
9ae0: 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69   though..  */.#i
9af0: 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52  f defined(STRERR
9b00: 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20  OR_R_CHAR_P) || 
9b10: 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e  defined(__USE_GN
9b20: 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65  U).  zErr = .# e
9b30: 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f  ndif.  strerror_
9b40: 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20  r(iErrno, aErr, 
9b50: 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b  sizeof(aErr)-1);
9b60: 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54  ..#elif SQLITE_T
9b70: 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54  HREADSAFE.  /* T
9b80: 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73  his is a threads
9b90: 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73  afe build, but s
9ba0: 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e  trerror_r() is n
9bb0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f  ot available. */
9bc0: 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65  .  zErr = "";.#e
9bd0: 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72  lse.  /* Non-thr
9be0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75  eadsafe build, u
9bf0: 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a  se strerror(). *
9c00: 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72  /.  zErr = strer
9c10: 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e  ror(iErrno);.#en
9c20: 64 69 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68  dif..  if( zPath
9c30: 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22  ==0 ) zPath = ""
9c40: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
9c50: 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22  errcode,.      "
9c60: 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25  os_unix.c:%d: (%
9c70: 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c  d) %s(%s) - %s",
9c80: 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45  .      iLine, iE
9c90: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
9ca0: 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20  th, zErr.  );.. 
9cb0: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
9cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
9cd0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
9ce0: 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  r..**.** We assu
9cf0: 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20  me that close() 
9d00: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f  almost always wo
9d10: 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73  rks, since it is
9d20: 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65   only in a.** ve
9d30: 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74  ry sick applicat
9d40: 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79  ion or on a very
9d50: 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74   sick platform t
9d60: 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69  hat it might fai
9d70: 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  l..** If it does
9d80: 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65   fail, simply le
9d90: 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
9da0: 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c  riptor, but do l
9db0: 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e  og the.** error.
9dc0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
9dd0: 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   it is not safe 
9de0: 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29  to retry close()
9df0: 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e   after EINTR sin
9e00: 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ce the.** file d
9e10: 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20  escriptor might 
9e20: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
9e30: 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74  n reused by anot
9e40: 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53  her thread..** S
9e50: 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20  o we don't even 
9e60: 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66  try to recover f
9e70: 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a  rom an EINTR.  J
9e80: 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f  ust log the erro
9e90: 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e  r.** and move on
9ea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9eb0: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e   robust_close(un
9ec0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
9ed0: 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  nt h, int lineno
9ee0: 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65  ){.  if( osClose
9ef0: 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c  (h) ){.    unixL
9f00: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51  ogErrorAtLine(SQ
9f10: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
9f20: 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20  , "close",.     
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f40: 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d    pFile ? pFile-
9f50: 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65  >zPath : 0, line
9f60: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
9f70: 2a 20 53 65 74 20 74 68 65 20 70 46 69 6c 65 2d  * Set the pFile-
9f80: 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f 20  >lastErrno.  Do 
9f90: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
9fa0: 74 69 6e 65 20 61 73 20 74 68 61 74 20 70 72 6f  tine as that pro
9fb0: 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f 6e 76 65  vides.** a conve
9fc0: 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73  nient place to s
9fd0: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 2e  et a breakpoint.
9fe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9ff0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75  storeLastErrno(u
a000: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
a010: 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46  int error){.  pF
a020: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
a030: 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   error;.}../*.**
a040: 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20   Close all file 
a050: 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75  descriptors accu
a060: 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e  muated in the un
a070: 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e  ixInodeInfo->pUn
a080: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73  used list..*/ .s
a090: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
a0a0: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
a0b0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
a0c0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
a0d0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
a0e0: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
a0f0: 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55  edFd *p;.  UnixU
a100: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a  nusedFd *pNext;.
a110: 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e    for(p=pInode->
a120: 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e  pUnused; p; p=pN
a130: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
a140: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
a150: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
a160: 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e  le, p->fd, __LIN
a170: 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  E__);.    sqlite
a180: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20  3_free(p);.  }. 
a190: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
a1a0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
a1b0: 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f  elease a unixIno
a1c0: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
a1d0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
a1e0: 63 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f  cated by findIno
a1f0: 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20  deInfo()..**.** 
a200: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
a210: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
a220: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
a230: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
a240: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
a250: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
a260: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
a270: 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  id releaseInodeI
a280: 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nfo(unixFile *pF
a290: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
a2a0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
a2b0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
a2c0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
a2d0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
a2e0: 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29  ( ALWAYS(pInode)
a2f0: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   ){.    pInode->
a300: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
a310: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  pInode->nRef==0 
a320: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a330: 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
a340: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c  e==0 );.      cl
a350: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
a360: 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
a370: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b  pInode->pPrev ){
a380: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a390: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
a3a0: 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  pNext==pInode );
a3b0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
a3c0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
a3d0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
a3e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a3f0: 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64      assert( inod
a400: 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  eList==pInode );
a410: 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69  .        inodeLi
a420: 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  st = pInode->pNe
a430: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
a440: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e    if( pInode->pN
a450: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ext ){.        a
a460: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a470: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e  Next->pPrev==pIn
a480: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
a490: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
a4a0: 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50  rev = pInode->pP
a4b0: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
a4c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a4d0: 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  pInode);.    }. 
a4e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
a4f0: 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
a500: 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20  tor, locate the 
a510: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
a520: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73  ject that.** des
a530: 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65  cribes that file
a540: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72   descriptor.  Cr
a550: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
a560: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
a570: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
a580: 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69  e might be unini
a590: 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65  tialized if an e
a5a0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  rror occurs..**.
a5b0: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74  ** The mutex ent
a5c0: 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75  ered using the u
a5d0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
a5e0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
a5f0: 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68   held.** when th
a600: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
a610: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
a620: 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  urn an appropria
a630: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
a640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
a650: 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e  dInodeInfo(.  un
a660: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a680: 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66  Unix file with f
a690: 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e  ile desc used in
a6a0: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e   the key */.  un
a6b0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70  ixInodeInfo **pp
a6c0: 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20  Inode        /* 
a6d0: 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49  Return the unixI
a6e0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
a6f0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
a700: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
a710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a720: 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72  ystem call retur
a730: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
a740: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
a750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a760: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
a770: 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20  r for pFile */. 
a780: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
a790: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
a7a0: 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f  /* Lookup key fo
a7b0: 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  r the unixInodeI
a7c0: 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nfo */.  struct 
a7d0: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
a7e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
a7f0: 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
a800: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49  ation */.  unixI
a810: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
a820: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e   = 0;     /* Can
a830: 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65  didate unixInode
a840: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  Info object */..
a850: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
a860: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20  texHeld() );..  
a870: 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c  /* Get low-level
a880: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
a890: 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  ut the file that
a8a0: 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a   we can used to.
a8b0: 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e    ** create a un
a8c0: 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  ique name for th
a8d0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66  e file..  */.  f
a8e0: 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
a8f0: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
a900: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
a910: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  ( rc!=0 ){.    s
a920: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
a930: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66  ile, errno);.#if
a940: 20 64 65 66 69 6e 65 64 28 45 4f 56 45 52 46 4c   defined(EOVERFL
a950: 4f 57 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  OW) && defined(S
a960: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
a970: 53 29 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  S).    if( pFile
a980: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
a990: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
a9a0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
a9b0: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
a9c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
a9d0: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
a9e0: 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58  E__.  /* On OS X
a9f0: 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c   on an msdos fil
aa00: 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f  esystem, the ino
aa10: 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70  de number is rep
aa20: 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72  orted.  ** incor
aa30: 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d  rectly for zero-
aa40: 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65  size files.  See
aa50: 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20   ticket #3260.  
aa60: 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f  To work.  ** aro
aa70: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
aa80: 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74   (we consider it
aa90: 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20   a bug in OS X, 
aaa0: 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a  not SQLite).  **
aab0: 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65   we always incre
aac0: 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ase the file siz
aad0: 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e  e to 1 by writin
aae0: 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  g a single byte.
aaf0: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63    ** prior to ac
ab00: 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64  cessing the inod
ab10: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f  e number.  The o
ab20: 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  ne byte written 
ab30: 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49  is.  ** an ASCII
ab40: 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77   'S' character w
ab50: 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e  hich also happen
ab60: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
ab70: 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74  t byte.  ** in t
ab80: 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65  he header of eve
ab90: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
aba0: 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  se.  In this way
abb0: 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  , if there.  ** 
abc0: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
abd0: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e  ion such that an
abe0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
abf0: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
ac00: 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  ed.  ** the firs
ac10: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
ac20: 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67  tabase, no damag
ac30: 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
ac40: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
ac50: 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69  _size==0 && (pFi
ac60: 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
ac70: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
ac80: 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20  MSDOS)!=0 ){.   
ac90: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74   do{ rc = osWrit
aca0: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d  e(fd, "S", 1); }
acb0: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
acc0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
acd0: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
ace0: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
acf0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
ad00: 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
ad10: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
ad20: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
ad30: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
ad40: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
ad50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  =0 ){.      stor
ad60: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
ad70: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
ad80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
ad90: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ERR;.    }.  }.#
ada0: 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28  endif..  memset(
adb0: 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65  &fileId, 0, size
adc0: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66  of(fileId));.  f
add0: 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74  ileId.dev = stat
ade0: 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20  buf.st_dev;.#if 
adf0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c  OS_VXWORKS.  fil
ae00: 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d  eId.pId = pFile-
ae10: 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69  >pId;.#else.  fi
ae20: 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62  leId.ino = statb
ae30: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69  uf.st_ino;.#endi
ae40: 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f  f.  pInode = ino
ae50: 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
ae60: 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d   pInode && memcm
ae70: 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f  p(&fileId, &pIno
ae80: 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  de->fileId, size
ae90: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
aea0: 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
aeb0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  de->pNext;.  }. 
aec0: 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29   if( pInode==0 )
aed0: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73  {.    pInode = s
aee0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
aef0: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
af00: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
af10: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
af20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
af30: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
af40: 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20  mset(pInode, 0, 
af50: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29  sizeof(*pInode))
af60: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49  ;.    memcpy(&pI
af70: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66  node->fileId, &f
af80: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
af90: 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f  leId));.    pIno
afa0: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
afb0: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20    pInode->pNext 
afc0: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
afd0: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d   pInode->pPrev =
afe0: 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64   0;.    if( inod
aff0: 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73  eList ) inodeLis
b000: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
b010: 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74  e;.    inodeList
b020: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c   = pInode;.  }el
b030: 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  se{.    pInode->
b040: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
b050: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b  pInode = pInode;
b060: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b070: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
b080: 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 46 69  turn TRUE if pFi
b090: 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61  le has been rena
b0a0: 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20  med or unlinked 
b0b0: 73 69 6e 63 65 20 69 74 20 77 61 73 20 66 69 72  since it was fir
b0c0: 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74  st opened..*/.st
b0d0: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73  atic int fileHas
b0e0: 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a  Moved(unixFile *
b0f0: 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56  pFile){.#if OS_V
b100: 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
b110: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
b120: 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d   && pFile->pId!=
b130: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66  pFile->pInode->f
b140: 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65  ileId.pId;.#else
b150: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
b160: 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69  uf;.  return pFi
b170: 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26  le->pInode!=0 &&
b180: 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70  .      (osStat(p
b190: 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75  File->zPath, &bu
b1a0: 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74 5f  f)!=0 || buf.st_
b1b0: 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f  ino!=pFile->pIno
b1c0: 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b  de->fileId.ino);
b1d0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
b1e0: 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69  * Check a unixFi
b1f0: 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61 74  le that is a dat
b200: 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20 74  abase.  Verify t
b210: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
b220: 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73  .** (1) There is
b230: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72   exactly one har
b240: 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69  d link on the fi
b250: 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69  le.** (2) The fi
b260: 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62  le is not a symb
b270: 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29  olic link.** (3)
b280: 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f   The file has no
b290: 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f  t been renamed o
b2a0: 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a  r unlinked.**.**
b2b0: 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c   Issue sqlite3_l
b2c0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b2d0: 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20  G,...) messages 
b2e0: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e  if anything is n
b2f0: 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  ot right..*/.sta
b300: 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79 44  tic void verifyD
b310: 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  bFile(unixFile *
b320: 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74  pFile){.  struct
b330: 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74   stat buf;.  int
b340: 20 72 63 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73   rc;.  rc = osFs
b350: 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
b360: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
b370: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b380: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b390: 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74 61  NG, "cannot fsta
b3a0: 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c 20 70  t db file %s", p
b3b0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
b3c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b3d0: 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b  if( buf.st_nlink
b3e0: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 63  ==0 && (pFile->c
b3f0: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
b400: 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  ILE_DELETE)==0 )
b410: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b420: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
b430: 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65 64  , "file unlinked
b440: 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22   while open: %s"
b450: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b460: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b470: 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c  .  if( buf.st_nl
b480: 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  ink>1 ){.    sql
b490: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b4a0: 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70  WARNING, "multip
b4b0: 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65  le links to file
b4c0: 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  : %s", pFile->zP
b4d0: 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ath);.    return
b4e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65  ;.  }.  if( file
b4f0: 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20  HasMoved(pFile) 
b500: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b510: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b520: 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64  G, "file renamed
b530: 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22   while open: %s"
b540: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b550: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b560: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
b570: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
b580: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
b590: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
b5a0: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
b5b0: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
b5c0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
b5d0: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
b5e0: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
b5f0: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
b600: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
b610: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
b620: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
b630: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
b640: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
b650: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
b660: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
b670: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
b680: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
b690: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
b6a0: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
b6b0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
b6c0: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
b6d0: 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
b6e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
b6f0: 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
b700: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
b710: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
b720: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
b730: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
b740: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
b750: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
b760: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
b770: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
b780: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
b790: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
b7a0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
b7b0: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
b7c0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
b7d0: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
b7e0: 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  eads */..  /* Ch
b7f0: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
b800: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
b810: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
b820: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
b830: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
b840: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
b850: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
b860: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
b870: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
b880: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
b890: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
b8a0: 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50  /.#ifndef __DJGP
b8b0: 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72  P__.  if( !reser
b8c0: 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70  ved && !pFile->p
b8d0: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
b8e0: 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ock ){.    struc
b8f0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
b900: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
b910: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
b920: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
b930: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
b940: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
b950: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
b960: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
b970: 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69   if( osFcntl(pFi
b980: 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  le->h, F_GETLK, 
b990: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
b9a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
b9b0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
b9c0: 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65  OCK;.      store
b9d0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
b9e0: 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 20 65   errno);.    } e
b9f0: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74  lse if( lock.l_t
ba00: 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype!=F_UNLCK ){.
ba10: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
ba20: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   1;.    }.  }.#e
ba30: 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65  ndif.  .  unixLe
ba40: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
ba50: 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
ba60: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75  LOCK %d %d %d (u
ba70: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
ba80: 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
ba90: 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
baa0: 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
bab0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bac0: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
bad0: 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e  a system-lock on
bae0: 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e   the file pFile.
baf0: 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a    The lock is .*
bb00: 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  * described by p
bb10: 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Lock..**.** If t
bb20: 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65  he pFile was ope
bb30: 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 66  ned read/write f
bb40: 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74  rom unix-excl, t
bb50: 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63  hen the only loc
bb60: 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e  k.** ever obtain
bb70: 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69  ed is an exclusi
bb80: 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20  ve lock, and it 
bb90: 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63  is obtained exac
bba0: 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20  tly once.** the 
bbb0: 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c  first time any l
bbc0: 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64  ock is attempted
bbd0: 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  .  All subsequen
bbe0: 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67  t system locking
bbf0: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62  .** operations b
bc00: 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c  ecome no-ops.  L
bc10: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
bc20: 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69  s still happen i
bc30: 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e  nternally,.** in
bc40: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69   order to coordi
bc50: 6e 61 74 65 20 61 63 63 65 73 73 20 62 65 74 77  nate access betw
bc60: 65 65 6e 20 73 65 70 61 72 61 74 65 20 64 61 74  een separate dat
bc70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
bc80: 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  s.** within this
bc90: 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c   process, but al
bca0: 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e  l of that is han
bcb0: 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61  dled in memory a
bcc0: 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  nd the.** operat
bcd0: 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ing system does 
bce0: 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65 2e  not participate.
bcf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
bd00: 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74  tion is a pass-t
bd10: 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28  hrough to fcntl(
bd20: 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c  F_SETLK) if pFil
bd30: 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e  e is using.** an
bd40: 79 20 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e  y VFS other than
bd50: 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20   "unix-excl" or 
bd60: 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e  if pFile is open
bd70: 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c  ed on "unix-excl
bd80: 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64  ".** and is read
bd90: 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72  -only..**.** Zer
bda0: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
bdb0: 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65   the call comple
bdc0: 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  tes successfully
bdd0: 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c  , or -1 if a cal
bde0: 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20  l.** to fcntl() 
bdf0: 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63  fails. In this c
be00: 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65  ase, errno is se
be10: 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20  t appropriately 
be20: 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f  (by fcntl())..*/
be30: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
be40: 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  FileLock(unixFil
be50: 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74  e *pFile, struct
be60: 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a   flock *pLock){.
be70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
be80: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
be90: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
bea0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
beb0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
bec0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
bed0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 46  !=0 );.  if( (pF
bee0: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
bef0: 20 28 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 7c   (UNIXFILE_EXCL|
bf00: 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29  UNIXFILE_RDONLY)
bf10: 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  )==UNIXFILE_EXCL
bf20: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   ){.    if( pIno
bf30: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
bf40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ==0 ){.      str
bf50: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
bf60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
bf70: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
bf80: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
bf90: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
bfa0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
bfb0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
bfc0: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
bfd0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
bfe0: 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  IZE;.      lock.
bff0: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
c000: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46  ;.      rc = osF
c010: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
c020: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
c030: 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29        if( rc<0 )
c040: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c050: 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65    pInode->bProce
c060: 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  ssLock = 1;.    
c070: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
c080: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
c090: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
c0a0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
c0b0: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
c0c0: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70  e->h, F_SETLK, p
c0d0: 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Lock);.  }.  ret
c0e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c0f0: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
c100: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
c110: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
c120: 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
c130: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
c140: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
c150: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
c160: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
c170: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
c180: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
c190: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
c1a0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
c1b0: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
c1c0: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
c1d0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
c1e0: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
c1f0: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
c200: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
c210: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
c220: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
c230: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
c240: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
c250: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
c260: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
c270: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
c280: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
c290: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
c2a0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
c2b0: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
c2c0: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
c2d0: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
c2e0: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
c2f0: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
c300: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
c310: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
c320: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
c330: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
c340: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
c350: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
c360: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
c370: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
c380: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
c390: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c3a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c3b0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
c3c0: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
c3d0: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
c3e0: 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
c3f0: 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
c400: 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
c410: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
c420: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
c430: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
c440: 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  ck){.  /* The fo
c450: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
c460: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
c470: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
c480: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
c490: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
c4a0: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
c4b0: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
c4c0: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
c4d0: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
c4e0: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
c4f0: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
c500: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
c510: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
c520: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
c530: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
c540: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
c550: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
c560: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
c570: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
c580: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
c590: 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74  ith windows syst
c5a0: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
c5b0: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
c5c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
c5d0: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
c5e0: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
c5f0: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
c600: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
c610: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
c620: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
c630: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
c640: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
c650: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
c660: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
c670: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
c680: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
c690: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
c6a0: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
c6b0: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
c6c0: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
c6d0: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
c6e0: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
c6f0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
c700: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
c710: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
c720: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
c730: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72   successful, a r
c740: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
c750: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
c760: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
c770: 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20  read-locked and 
c780: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
c790: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
c7a0: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  eleased..  **.  
c7b0: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
c7c0: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
c7d0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
c7e0: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
c7f0: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
c800: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
c810: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
c820: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
c830: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
c840: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
c850: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
c860: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
c870: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
c880: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
c890: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
c8a0: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
c8b0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
c8c0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
c8d0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
c8e0: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
c8f0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
c900: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
c910: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
c920: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
c930: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
c940: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
c950: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
c960: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
c970: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
c980: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
c990: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
c9a0: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
c9b0: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
c9c0: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
c9d0: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
c9e0: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
c9f0: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
ca00: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
ca10: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
ca20: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
ca30: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
ca40: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
ca50: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
ca60: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
ca70: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
ca80: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
ca90: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
caa0: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
cab0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
cac0: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
cad0: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
cae0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
caf0: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
cb00: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
cb10: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
cb20: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
cb30: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
cb40: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
cb50: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20  tabase. .  **.  
cb60: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20  ** The reason a 
cb70: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e  single byte cann
cb80: 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ot be used inste
cb90: 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65  ad of the 'share
cba0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
cbb0: 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20  e' is that some 
cbc0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64  versions of wind
cbd0: 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  ows do not suppo
cbe0: 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42  rt read-locks. B
cbf0: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61  y.  ** locking a
cc00: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
cc10: 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75  m a range, concu
cc20: 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63  rrent SHARED loc
cc30: 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a  ks may exist.  *
cc40: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f  * even if the lo
cc50: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20  cking primitive 
cc60: 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61  used is always a
cc70: 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a   write-lock..  *
cc80: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
cc90: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
cca0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
ccb0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
ccc0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
ccd0: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
cce0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74  ck lock;.  int t
ccf0: 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  Errno = 0;..  as
cd00: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
cd10: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
cd20: 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
cd30: 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %s,%d) pid=%d (u
cd40: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
cd50: 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c  h,.      azFileL
cd60: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
cd70: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
cd80: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
cd90: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70      azFileLock(p
cda0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
cdb0: 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d  ileLock), pFile-
cdc0: 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
cdd0: 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64  ,.      osGetpid
cde0: 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (0)));..  /* If 
cdf0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
ce00: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
ce10: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
ce20: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
ce30: 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
ce40: 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
ce50: 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
ce60: 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
ce70: 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
ce80: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
ce90: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
cea0: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
ceb0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
cec0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
ced0: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
cee0: 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
cef0: 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22   held) (unix)\n"
cf00: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
cf10: 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
cf20: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
cf30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
cf40: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
cf50: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
cf60: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
cf70: 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a  is correct..  **
cf80: 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
cf90: 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
cfa0: 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
cfb0: 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
cfc0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
cfd0: 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
cfe0: 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
cff0: 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
d000: 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
d010: 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
d020: 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
d030: 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
d040: 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
d050: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
d060: 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
d070: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
d080: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
d090: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
d0a0: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
d0b0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
d0c0: 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
d0d0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
d0e0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
d0f0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
d100: 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
d110: 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
d120: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
d130: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
d140: 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
d150: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
d160: 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
d170: 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49  >pInode;..  /* I
d180: 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
d190: 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
d1a0: 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
d1b0: 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
d1c0: 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
d1d0: 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
d1e0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
d1f0: 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
d200: 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
d210: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f  >eFileLock!=pIno
d220: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26  de->eFileLock &&
d230: 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 6e   .          (pIn
d240: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
d250: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
d260: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
d270: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
d280: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
d290: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  Y;.    goto end_
d2a0: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
d2b0: 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
d2c0: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
d2d0: 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
d2e0: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
d2f0: 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
d300: 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
d310: 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
d320: 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
d330: 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
d340: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
d350: 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
d360: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d370: 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
d380: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
d390: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d3a0: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
d3b0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
d3c0: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
d3d0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
d3e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
d3f0: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
d400: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
d410: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
d420: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
d430: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
d440: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
d450: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
d460: 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
d470: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
d480: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  +;.    goto end_
d490: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  lock;.  }...  /*
d4a0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
d4b0: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
d4c0: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
d4d0: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
d4e0: 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
d4f0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
d500: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
d510: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
d520: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
d530: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
d540: 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e   */.  lock.l_len
d550: 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f   = 1L;.  lock.l_
d560: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d570: 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  T;.  if( eFileLo
d580: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d590: 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
d5a0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
d5b0: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
d5c0: 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
d5d0: 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
d5e0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65  lock.l_type = (e
d5f0: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
d600: 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f  _LOCK?F_RDLCK:F_
d610: 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b  WRLCK);.    lock
d620: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
d630: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28  NG_BYTE;.    if(
d640: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
d650: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
d660: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
d670: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
d680: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d690: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
d6a0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
d6b0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
d6c0: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
d6d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
d6e0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
d6f0: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
d700: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
d710: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
d720: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
d730: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
d740: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
d750: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
d760: 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
d770: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
d780: 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
d790: 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
d7a0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d7b0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d7c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d7d0: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
d7e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
d7f0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d800: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d810: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d820: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
d830: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
d840: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
d850: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
d860: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
d870: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
d880: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
d890: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d8a0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
d8b0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d8c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d8d0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d8e0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d8f0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
d900: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
d910: 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
d920: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
d930: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
d940: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
d950: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
d960: 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e   = 1L;.    lock.
d970: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
d980: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
d990: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
d9a0: 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49  ock) && rc==SQLI
d9b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
d9c0: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70  * This could hap
d9d0: 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f  pen with a netwo
d9e0: 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rk mount */.    
d9f0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
da00: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
da10: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
da20: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
da30: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
da40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
da50: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  Y ){.        sto
da60: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
da70: 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
da80: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
da90: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  nd_lock;.    }el
daa0: 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
dab0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
dac0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
dad0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
dae0: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
daf0: 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
db00: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
db10: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
db20: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
db30: 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
db40: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
db50: 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
db60: 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
db70: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
db80: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d   this.    ** sam
db90: 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
dba0: 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
dbb0: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
dbc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
dbd0: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
dbe0: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
dbf0: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
dc00: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
dc10: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
dc20: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
dc30: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
dc40: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
dc50: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
dc60: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
dc70: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
dc80: 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
dc90: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b  Lock );.    lock
dca0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
dcb0: 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  K;..    assert( 
dcc0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
dcd0: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  VED_LOCK || eFil
dce0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
dcf0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28  _LOCK );.    if(
dd00: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
dd10: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
dd20: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
dd30: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
dd40: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
dd50: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73  n = 1L;.    }els
dd60: 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  e{.      lock.l_
dd70: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
dd80: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
dd90: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
dda0: 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  SIZE;.    }..   
ddb0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
ddc0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
ddd0: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
dde0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
ddf0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
de00: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
de10: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
de20: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
de30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
de40: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
de50: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
de60: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
de70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
de80: 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54    ..#ifdef SQLIT
de90: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74  E_DEBUG.  /* Set
dea0: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
deb0: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
dec0: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
ded0: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
dee0: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
def0: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
df00: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
df10: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
df20: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
df30: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
df40: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
df50: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
df60: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
df70: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
df80: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
df90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dfa0: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
dfb0: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
dfc0: 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
dfd0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
dfe0: 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
dff0: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
e000: 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
e010: 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
e020: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
e030: 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
e040: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
e050: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e060: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
e070: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
e080: 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
e090: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
e0a0: 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
e0b0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
e0c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
e0d0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
e0e0: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
e0f0: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
e100: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
e110: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
e120: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
e130: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
e140: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
e150: 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78    %d %s %s (unix
e160: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
e170: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
e180: 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63  Lock), .      rc
e190: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
e1a0: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
e1b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e1c0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66  ./*.** Add the f
e1d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
e1e0: 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64  sed by file hand
e1f0: 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20  le pFile to the 
e200: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
e210: 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a   pUnused list..*
e220: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
e230: 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46  tPendingFd(unixF
e240: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
e250: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
e260: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
e270: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
e280: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
e290: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  >pUnused;.  p->p
e2a0: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
e2b0: 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65  Unused;.  pInode
e2c0: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
e2d0: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
e2e0: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
e2f0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
e300: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
e310: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
e320: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
e330: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
e340: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
e350: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
e360: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
e370: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
e380: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
e390: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
e3a0: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
e3b0: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
e3c0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
e3d0: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
e3e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
e3f0: 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68  -op..** .** If h
e400: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69  andleNFSUnlock i
e410: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20  s true, then on 
e420: 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45  downgrading an E
e430: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f  XCLUSIVE_LOCK to
e440: 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62   SHARED.** the b
e450: 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76  yte range is div
e460: 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74  ided into 2 part
e470: 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  s and the first 
e480: 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64  part is unlocked
e490: 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20   then.** set to 
e4a0: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65  a read lock, the
e4b0: 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74  n the other part
e4c0: 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63   is simply unloc
e4d0: 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ked.  This works
e4e0: 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75   .** around a bu
e4f0: 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63  g in BSD NFS loc
e500: 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e  kd (also seen on
e510: 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74   MacOSX 10.3+) t
e520: 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a  hat fails to .**
e530: 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74   remove the writ
e540: 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69  e lock on a regi
e550: 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  on when a read l
e560: 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  ock is set..*/.s
e570: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55  tatic int posixU
e580: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
e590: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
e5a0: 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c  eLock, int handl
e5b0: 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75  eNFSUnlock){.  u
e5c0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e5d0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e5e0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
e5f0: 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
e600: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
e610: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e620: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
e630: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
e640: 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
e650: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
e660: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
e670: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
e680: 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69  eLock,.      pFi
e690: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
e6a0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
e6b0: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
e6c0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
e6d0: 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28  .      osGetpid(
e6e0: 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  0)));..  assert(
e6f0: 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
e700: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
e710: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e720: 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k<=eFileLock ){.
e730: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e740: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
e750: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
e760: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
e770: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
e780: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
e790: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  d!=0 );.  if( pF
e7a0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
e7b0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
e7c0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
e7d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69  ->eFileLock==pFi
e7e0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
e7f0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e800: 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
e810: 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
e820: 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
e830: 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
e840: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
e850: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
e860: 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
e870: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
e880: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
e890: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
e8a0: 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
e8b0: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
e8c0: 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
e8d0: 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
e8e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
e8f0: 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
e900: 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
e910: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
e920: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
e930: 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
e940: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
e950: 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
e960: 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
e970: 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
e980: 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
e990: 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
e9a0: 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
e9b0: 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
e9c0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
e9d0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46  n..    */.    pF
e9e0: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
e9f0: 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  te = 0;.#endif..
ea00: 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69      /* downgradi
ea10: 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ng to a shared l
ea20: 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c  ock on NFS invol
ea30: 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65  ves clearing the
ea40: 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20   write lock.    
ea50: 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c  ** before establ
ea60: 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c  ishing the readl
ea70: 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61  ock - to avoid a
ea80: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
ea90: 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20  we downgrade.   
eaa0: 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20   ** the lock in 
eab0: 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61  2 blocks, so tha
eac0: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61  t part of the ra
ead0: 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65  nge will be cove
eae0: 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a  red by a .    **
eaf0: 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69   write lock unti
eb00: 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f  l the rest is co
eb10: 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20  vered by a read 
eb20: 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a  lock:.    **  1:
eb30: 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a     [WWWWW].    *
eb40: 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a  *  2:   [....W].
eb50: 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52      **  3:   [RR
eb60: 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20  RRW].    **  4: 
eb70: 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f    [RRRR.].    */
eb80: 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  .    if( eFileLo
eb90: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
eba0: 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
ebb0: 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53  __APPLE__) || !S
ebc0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
ebd0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
ebe0: 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53   (void)handleNFS
ebf0: 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  Unlock;.      as
ec00: 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55  sert( handleNFSU
ec10: 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64  nlock==0 );.#end
ec20: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
ec30: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
ec40: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
ec50: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
ec60: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
ec70: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ck ){.        in
ec80: 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
ec90: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
eca0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
ecb0: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
ecc0: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
ecd0: 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
ece0: 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
ecf0: 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
ed00: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
ed10: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ed20: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ed30: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
ed40: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ed50: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
ed60: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
ed70: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
ed80: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
ed90: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
eda0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
edb0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
edc0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
edd0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
ede0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  OCK;.          s
edf0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
ee00: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
ee10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
ee20: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
ee30: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
ee40: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
ee50: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ee60: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ee70: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
ee80: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ee90: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
eea0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
eeb0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
eec0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
eed0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
eee0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
eef0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ef00: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ef10: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
ef20: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
ef30: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  , SQLITE_IOERR_R
ef40: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
ef50: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
ef60: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
ef70: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
ef80: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
ef90: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
efa0: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
efb0: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
efc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
efd0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
efe0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
eff0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
f000: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
f010: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
f020: 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53  HARED_FIRST+divS
f030: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  ize;.        loc
f040: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
f050: 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20  _SIZE-divSize;. 
f060: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
f070: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f080: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
f090: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
f0a0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
f0b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
f0c0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
f0d0: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
f0e0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
f0f0: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
f100: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
f110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f120: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
f130: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
f140: 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
f150: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
f160: 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20  LE */.      {.  
f170: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
f180: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
f190: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f1a0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f1b0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
f1c0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f1d0: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
f1e0: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
f1f0: 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66  SIZE;.        if
f200: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f210: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
f220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
f230: 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c  theory, the call
f240: 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b   to unixFileLock
f250: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62  () cannot fail b
f260: 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20  ecause another. 
f270: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
f280: 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ess is holding a
f290: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c  n incompatible l
f2a0: 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  ock. If it does,
f2b0: 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
f2c0: 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68   ** indicates th
f2d0: 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f  at the other pro
f2e0: 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
f2f0: 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e  owing the lockin
f300: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  g.          ** p
f310: 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73  rotocol. If this
f320: 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e   happens, return
f330: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
f340: 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a  LOCK. Returning.
f350: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
f360: 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63  ITE_BUSY would c
f370: 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72  onfuse the upper
f380: 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74   layer (in pract
f390: 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20  ice it causes . 
f3a0: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61           ** an a
f3b0: 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20  ssert to fail). 
f3c0: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63  */ .          rc
f3d0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f3e0: 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  RDLOCK;.        
f3f0: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f400: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
f410: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
f420: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
f430: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f440: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
f450: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
f460: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f470: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f480: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
f490: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
f4a0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
f4b0: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
f4c0: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
f4d0: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
f4e0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f4f0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
f500: 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  0 ){.      pInod
f510: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
f520: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
f530: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
f540: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
f550: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f  NLOCK;.      sto
f560: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
f570: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
f580: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
f590: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f5a0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
f5b0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44  LOCK ){.    /* D
f5c0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
f5d0: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
f5e0: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
f5f0: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
f600: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
f610: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
f620: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
f630: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
f640: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
f650: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
f660: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
f670: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
f680: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
f690: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
f6a0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
f6b0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f6c0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f6d0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
f6e0: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
f6f0: 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75   0L;.      if( u
f700: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f710: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
f720: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
f730: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
f740: 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OCK;.      }else
f750: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
f760: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f770: 43 4b 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  CK;.        stor
f780: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
f790: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
f7a0: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
f7b0: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
f7c0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
f7d0: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f7e0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
f7f0: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
f800: 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
f810: 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
f820: 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
f830: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
f840: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
f850: 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
f860: 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
f870: 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
f880: 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
f890: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
f8a0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
f8b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
f8c0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
f8d0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
f8e0: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
f8f0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
f900: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
f910: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
f920: 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
f930: 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20  }..end_unlock:. 
f940: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
f950: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
f960: 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
f970: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
f980: 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
f990: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
f9a0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
f9b0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
f9c0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
f9d0: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
f9e0: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
f9f0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
fa00: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
fa10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
fa20: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
fa30: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
fa40: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
fa50: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
fa60: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
fa70: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
fa80: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
fa90: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
faa0: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69   unixUnlock(sqli
fab0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
fac0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69  t eFileLock){.#i
fad0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
fae0: 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72  P_SIZE>0.  asser
faf0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
fb00: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75  ARED_LOCK || ((u
fb10: 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e  nixFile *)id)->n
fb20: 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23  FetchOut==0 );.#
fb30: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
fb40: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
fb50: 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
fb60: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
fb70: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
fb80: 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
fb90: 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
fba0: 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74  , i64 nByte);.st
fbb0: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e  atic void unixUn
fbc0: 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  mapfile(unixFile
fbd0: 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a   *pFd);.#endif..
fbe0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
fbf0: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
fc00: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
fc10: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
fc20: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
fc30: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
fc40: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
fc50: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
fc60: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
fc70: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
fc80: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
fc90: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
fca0: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
fcb0: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
fcc0: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
fcd0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
fce0: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
fcf0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
fd00: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
fd10: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
fd20: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
fd30: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
fd40: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
fd50: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
fd60: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
fd70: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
fd80: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
fd90: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
fda0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
fdb0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23  (unixFile*)id;.#
fdc0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
fdd0: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
fde0: 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
fdf0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
fe00: 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
fe10: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
fe20: 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
fe30: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
fe40: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
fe50: 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
fe60: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
fe70: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  d ){.    if( pFi
fe80: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
fe90: 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
fea0: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
feb0: 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
fec0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
fed0: 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
fee0: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
fef0: 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
ff00: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
ff10: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
ff20: 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41   SQLITE_UNLINK_A
ff30: 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28  FTER_CLOSE.  if(
ff40: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
ff50: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
ff60: 45 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c  ETE ){.    osUnl
ff70: 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ink(pFile->zPath
ff80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ff90: 72 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46  ree(*(char**)&pF
ffa0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
ffb0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
ffc0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
ffd0: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
ffe0: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
fff0: 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
10000 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
10010 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
10020 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  pUnused);.  mems
10030 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
10040 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
10050 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10060 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
10070 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
10080 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
10090 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
100a0 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
100b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
100c0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
100d0 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
100e0 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70    verifyDbFile(p
100f0 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c  File);.  unixUnl
10100 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
10110 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
10120 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78  ex();..  /* unix
10130 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61  File.pInode is a
10140 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65  lways valid here
10150 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64  . Otherwise, a d
10160 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20  ifferent close. 
10170 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67   ** routine (e.g
10180 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29  . nolockClose())
10190 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64   would be called
101a0 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20   instead..  */. 
101b0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
101c0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20  pInode->nLock>0 
101d0 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  || pFile->pInode
101e0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
101f0 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  0 );.  if( ALWAY
10200 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29  S(pFile->pInode)
10210 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   && pFile->pInod
10220 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
10230 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10240 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
10250 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
10260 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
10270 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65  e just.    ** ye
10280 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
10290 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
102a0 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
102b0 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
102c0 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
102d0 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75   to pInode->pUnu
102e0 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69  sed list.  It wi
102f0 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
10300 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20  lly closed .    
10310 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
10320 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
10330 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74  ..    */.    set
10340 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
10350 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49  ;.  }.  releaseI
10360 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
10370 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
10380 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69  xFile(id);.  uni
10390 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
103a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
103b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
103c0 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20  nd of the posix 
103d0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d  advisory lock im
103e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
103f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
10450 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
10460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
104a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
104c0 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  o-op Locking ***
104d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
104f0 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72  **.** Of the var
10500 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  ious locking imp
10510 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61  lementations ava
10520 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20  ilable, this is 
10530 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69  by far the.** si
10540 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67  mplest:  locking
10550 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f   is ignored.  No
10560 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
10570 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74   to lock the dat
10580 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f  abase.** file fo
10590 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  r reading or wri
105a0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ting..**.** This
105b0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
105c0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
105d0 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c   use on read-onl
105e0 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28  y databases.** (
105f0 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68  ex: databases th
10600 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e  at are burned in
10610 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65  to CD-ROM, for e
10620 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e  xample.)  It can
10630 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64  .** also be used
10640 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   if the applicat
10650 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65  ion employs some
10660 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e   external mechan
10670 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e  ism to.** preven
10680 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61  t simultaneous a
10690 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d  ccess of the sam
106a0 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77  e database by tw
106b0 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74  o or more.** dat
106c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
106d0 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  s.  But there is
106e0 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20   a serious risk 
106f0 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  of database.** c
10700 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69  orruption if thi
10710 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
10720 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74  s used in situat
10730 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69  ions where multi
10740 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ple.** database 
10750 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
10760 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
10770 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
10780 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   at the same.** 
10790 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20  time and one or 
107a0 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f  more of those co
107b0 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72  nnections are wr
107c0 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69  iting..*/..stati
107d0 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63  c int nolockChec
107e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
107f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
10800 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  sed, int *pResOu
10810 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
10820 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
10830 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b  .  *pResOut = 0;
10840 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10850 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
10860 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  t nolockLock(sql
10870 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
10880 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
10890 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
108a0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
108b0 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
108c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
108d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
108e0 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
108f0 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
10900 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
10910 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10920 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
10930 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
10940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10950 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69  .** Close the fi
10960 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
10970 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  t nolockClose(sq
10980 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
10990 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  {.  return close
109a0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
109b0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
109c0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
109d0 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
109e0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
109f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a00 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
10a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
10a50 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
10a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10aa0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
10ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
10ac0 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69  n dot-file Locki
10ad0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
10ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10af0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66  *.**.** The dotf
10b00 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ile locking impl
10b10 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
10b20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66  the existence of
10b30 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a   separate lock.*
10b40 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20  * files (really 
10b50 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20  a directory) to 
10b60 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74  control access t
10b70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
10b80 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f   This works.** o
10b90 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65  n just about eve
10ba0 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d  ry filesystem im
10bb0 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74  aginable.  But t
10bc0 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73  here are serious
10bd0 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a   downsides:.**.*
10be0 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20  *    (1)  There 
10bf0 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65  is zero concurre
10c00 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72  ncy.  A single r
10c10 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c  eader blocks all
10c20 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
10c30 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72    connections fr
10c40 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  om reading or wr
10c50 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
10c60 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
10c70 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e    An application
10c80 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20   crash or power 
10c90 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73  loss can leave s
10ca0 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a  tale lock files.
10cb0 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69  **         sitti
10cc0 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e  ng around that n
10cd0 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
10ce0 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a  d manually..**.*
10cf0 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20  * Nevertheless, 
10d00 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20  a dotlock is an 
10d10 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
10d20 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65  ing mode for use
10d30 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20   if no.** other 
10d40 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
10d50 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
10d60 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63  *.** Dotfile loc
10d70 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72  king works by cr
10d80 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65  eating a subdire
10d90 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d  ctory in the sam
10da0 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a  e directory as.*
10db0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
10dc0 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  nd with the same
10dd0 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61   name but with a
10de0 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69   ".lock" extensi
10df0 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65  on added..** The
10e00 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20   existence of a 
10e10 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69  lock directory i
10e20 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
10e30 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
10e40 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70  ther.** lock typ
10e50 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
10e60 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
10e70 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
10e80 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
10e90 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
10ea0 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
10eb0 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
10ec0 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
10ed0 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
10ee0 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f  ck directory..*/
10ef0 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b  .#define DOTLOCK
10f00 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a  _SUFFIX ".lock".
10f10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10f20 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
10f30 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
10f40 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
10f50 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
10f60 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
10f70 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
10f80 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
10f90 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
10fa0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
10fb0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
10fc0 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
10fd0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
10fe0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
10ff0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
11000 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
11010 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
11020 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
11030 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  k checking..**.*
11040 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63  * In dotfile loc
11050 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c  king, either a l
11060 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74  ock exists or it
11070 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69   does not.  So i
11080 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74  n this.** variat
11090 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65  ion of CheckRese
110a0 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65  rvedLock(), *pRe
110b0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  sOut is set to t
110c0 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a  rue if any lock.
110d0 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ** is held on th
110e0 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65  e file and false
110f0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
11100 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61  unlocked..*/.sta
11110 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
11120 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
11130 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11140 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
11150 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
11160 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
11170 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
11180 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11190 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
111a0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
111b0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
111c0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
111d0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
111e0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
111f0 20 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d   );.  reserved =
11200 20 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74   osAccess((const
11210 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f   char*)pFile->lo
11220 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29  ckingContext, 0)
11230 3d 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ==0;.  OSTRACE((
11240 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
11250 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
11260 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
11270 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
11280 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
11290 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
112a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
112b0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
112c0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
112d0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
112e0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
112f0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
11300 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
11310 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
11320 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
11330 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
11340 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
11350 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
11360 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
11370 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
11380 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
11390 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
113a0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
113b0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
113c0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
113d0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
113e0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
113f0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
11400 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
11410 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
11420 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
11430 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
11440 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
11450 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
11460 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
11470 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
11480 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
11490 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
114a0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
114b0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
114c0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
114d0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
114e0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
114f0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
11500 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11510 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
11520 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
11530 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11540 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
11550 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
11560 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
11570 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
11580 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
11590 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
115a0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
115b0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
115c0 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
115d0 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
115e0 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
115f0 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
11600 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
11610 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
11620 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
11630 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
11640 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
11650 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
11660 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11670 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
11680 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
11690 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
116a0 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
116b0 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
116c0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
116d0 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
116e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a   = SQLITE_OK;...
116f0 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
11700 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
11710 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  he lock file alr
11720 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c  eady exists.  Al
11730 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
11740 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f  o do is adjust o
11750 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  ur internal reco
11760 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c  rd of the lock l
11770 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  evel..  */.  if(
11780 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11790 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  k > NO_LOCK ){. 
117a0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
117b0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
117c0 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
117d0 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
117e0 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
117f0 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41  ile */.#ifdef HA
11800 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69  VE_UTIME.    uti
11810 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  me(zLockFile, NU
11820 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  LL);.#else.    u
11830 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
11840 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
11850 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11860 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11870 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
11880 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20  ve lock */.  rc 
11890 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46  = osMkdir(zLockF
118a0 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66  ile, 0777);.  if
118b0 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( rc<0 ){.    /*
118c0 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
118d0 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20  create the lock 
118e0 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
118f0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
11900 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
11910 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
11920 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
11930 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
11940 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
11950 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11960 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
11970 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
11980 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
11990 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
119a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
119b0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
119c0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
119d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
119e0 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a  urn rc;.  } .  .
119f0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
11a00 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
11a10 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
11a20 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
11a30 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
11a40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11a50 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
11a60 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
11a70 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
11a80 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
11a90 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
11aa0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
11ab0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
11ac0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
11ad0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11ae0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
11af0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
11b00 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
11b10 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
11b20 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
11b30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
11b40 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
11b50 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
11b60 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
11b70 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
11b80 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
11b90 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
11ba0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
11bb0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
11bc0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
11bd0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11be0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
11bf0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
11c00 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
11c10 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
11c20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
11c30 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
11c40 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
11c50 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
11c60 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  id=%d (dotlock)\
11c70 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
11c80 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
11c90 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
11ca0 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
11cb0 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
11cc0 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
11cd0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
11ce0 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
11cf0 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
11d00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
11d10 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
11d20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11d30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f  .  }..  /* To do
11d40 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65  wngrade to share
11d50 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65  d, simply update
11d60 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   our internal no
11d70 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
11d80 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f   lock state.  No
11d90 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69   need to mess wi
11da0 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  th the file on d
11db0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
11dc0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
11dd0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  D_LOCK ){.    pF
11de0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
11df0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
11e00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11e10 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
11e20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20  To fully unlock 
11e30 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65  the database, de
11e40 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
11e50 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
11e60 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
11e70 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52  CK );.  rc = osR
11e80 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b  mdir(zLockFile);
11e90 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20  .  if( rc<0 ){. 
11ea0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
11eb0 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74  errno;.    if( t
11ec0 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b  Errno==ENOENT ){
11ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
11ee0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
11ef0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
11f00 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
11f10 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
11f20 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
11f30 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
11f40 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
11f50 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
11f60 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
11f70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11f80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
11f90 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20  e a file.  Make 
11fa0 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  sure the lock ha
11fb0 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  s been released 
11fc0 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a  before closing..
11fd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11fe0 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  tlockClose(sqlit
11ff0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
12000 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12010 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12020 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ;.  assert( id!=
12030 30 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  0 );.  dotlockUn
12040 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
12050 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
12060 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
12070 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75  Context);.  retu
12080 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
12090 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  (id);.}./*******
120a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
120b0 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
120c0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
120d0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
120e0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
120f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12130 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
12140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12180 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121a0 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
121b0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
121c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121d0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
121e0 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
121f0 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
12200 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
12210 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
12220 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
12230 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
12240 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
12250 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
12260 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
12270 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
12280 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
12290 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
122a0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
122b0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
122c0 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
122d0 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
122e0 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
122f0 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
12300 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12310 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
12320 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
12330 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
12340 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
12350 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
12360 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
12370 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
12380 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
12390 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
123a0 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
123b0 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
123c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
123d0 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
123e0 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.*/.#if SQLITE_
123f0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12400 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  TYLE../*.** Retr
12410 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  y flock() calls 
12420 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45  that fail with E
12430 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45  INTR.*/.#ifdef E
12440 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20  INTR.static int 
12450 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74  robust_flock(int
12460 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   fd, int op){.  
12470 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
12480 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b   = flock(fd,op);
12490 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
124a0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
124b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
124c0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72  #else.# define r
124d0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29  obust_flock(a,b)
124e0 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64   flock(a,b).#end
124f0 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  if.     ../*.** 
12500 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
12510 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
12520 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
12530 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
12540 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
12550 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
12560 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
12570 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
12580 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
12590 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
125a0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
125b0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
125c0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
125d0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
125e0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
125f0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
12600 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
12610 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
12620 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
12630 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  nt flockCheckRes
12640 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
12650 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12660 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
12670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12680 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
12690 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
126a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
126b0 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
126c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
126d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
126e0 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
126f0 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
12700 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12710 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
12720 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
12730 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
12740 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
12750 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
12760 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
12770 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
12780 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
12790 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
127a0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
127b0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
127c0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
127d0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  d ){.    /* atte
127e0 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
127f0 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ock */.    int l
12800 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
12810 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
12820 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
12830 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
12840 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
12850 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
12860 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
12870 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
12880 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
12890 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20  .      if ( lrc 
128a0 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
128b0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
128c0 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63          /* unloc
128d0 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e  k failed with an
128e0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
128f0 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49    lrc = SQLITE_I
12900 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20  OERR_UNLOCK; .  
12910 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
12920 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
12930 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
12940 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
12950 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
12960 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
12970 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
12980 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
12990 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
129a0 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
129b0 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
129c0 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
129d0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
129e0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
129f0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
12a00 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12a10 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
12a20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
12a30 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
12a40 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
12a50 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
12a60 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
12a70 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
12a80 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b   %d %d %d (flock
12a90 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12aa0 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
12ab0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
12ac0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
12ad0 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
12ae0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
12af0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
12b00 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
12b10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73  LITE_OK;.    res
12b20 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e  erved=1;.  }.#en
12b30 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
12b40 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
12b50 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65  ERRORS */.  *pRe
12b60 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
12b70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12b80 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
12b90 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
12ba0 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
12bb0 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
12bc0 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
12bd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
12be0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
12bf0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
12c00 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
12c10 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
12c20 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
12c30 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
12c40 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
12c50 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
12c60 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
12c70 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
12c80 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
12c90 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
12ca0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
12cb0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
12cc0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
12cd0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
12ce0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
12cf0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
12d00 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
12d10 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
12d20 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
12d30 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
12d40 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
12d50 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
12d60 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
12d70 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
12d80 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
12d90 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
12da0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
12db0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
12dc0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
12dd0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
12de0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
12df0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
12e00 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
12e10 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
12e20 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
12e30 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  IVE.**.** flock(
12e40 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  ) only really su
12e50 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
12e60 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
12e70 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
12e80 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
12e90 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
12ea0 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
12eb0 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
12ec0 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
12ed0 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
12ee0 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
12ef0 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
12f00 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
12f10 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
12f20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12f30 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
12f40 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
12f50 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
12f60 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
12f70 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
12f80 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
12f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
12fa0 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
12fb0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
12fc0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
12fd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12fe0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12ff0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13000 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
13010 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
13020 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
13030 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
13040 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
13050 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
13060 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
13070 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
13080 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
13090 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
130a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
130b0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
130c0 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
130d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
130e0 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
130f0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
13100 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66   .  if (robust_f
13110 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
13120 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
13130 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  )) {.    int tEr
13140 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
13150 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
13160 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
13170 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
13180 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
13190 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
131a0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
131b0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
131c0 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
131d0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
131e0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
131f0 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
13200 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c  {.    /* got it,
13210 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
13220 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
13230 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13240 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13250 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
13260 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
13270 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  s (flock)\n", pF
13280 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
13290 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
132a0 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
132b0 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
132c0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69  : "failed"));.#i
132d0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
132e0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
132f0 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
13300 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
13310 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
13320 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13330 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
13340 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
13350 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13360 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
13370 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
13380 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
13390 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
133a0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
133b0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
133c0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
133d0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
133e0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
133f0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
13400 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13410 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
13420 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
13430 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
13440 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
13450 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
13460 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13470 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
13480 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
13490 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
134a0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
134b0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
134c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
134d0 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
134e0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
134f0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
13500 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
13510 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20  =%d (flock)\n", 
13520 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
13530 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
13540 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13550 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
13560 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
13570 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
13580 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
13590 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
135a0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
135b0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
135c0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
135d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
135e0 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
135f0 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
13600 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
13610 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
13620 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
13630 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
13640 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
13650 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13660 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
13670 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13680 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
13690 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a  eally, unlock. *
136a0 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66  /.  if( robust_f
136b0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
136c0 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65  OCK_UN) ){.#ifde
136d0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
136e0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
136f0 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  S.    return SQL
13700 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f  ITE_OK;.#endif /
13710 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
13720 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
13730 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  S */.    return 
13740 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
13750 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OCK;.  }else{.  
13760 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13770 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
13780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13790 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
137a0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
137b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
137c0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
137d0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61 73  file *id) {.  as
137e0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
137f0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
13800 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74   NO_LOCK);.  ret
13810 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
13820 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  e(id);.}..#endif
13830 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
13840 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
13850 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
13860 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
13870 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
13880 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
13890 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
138a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138b0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
138c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13900 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13950 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
13970 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
13980 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
13990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139a0 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
139b0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
139c0 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
139d0 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
139e0 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
139f0 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
13a00 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
13a10 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
13a20 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
13a30 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
13a40 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
13a50 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
13a60 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
13a70 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
13a80 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
13a90 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
13aa0 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
13ab0 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
13ac0 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
13ad0 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
13ae0 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
13af0 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
13b00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
13b10 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
13b20 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13b30 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
13b40 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
13b50 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
13b60 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
13b70 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
13b80 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
13b90 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
13ba0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
13bb0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
13bc0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
13bd0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
13be0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
13bf0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
13c00 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
13c10 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
13c20 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
13c30 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73  int semXCheckRes
13c40 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
13c50 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13c60 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
13c70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13c80 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
13c90 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
13ca0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13cb0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
13cc0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13cd0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13ce0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
13cf0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
13d00 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
13d10 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
13d20 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
13d30 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
13d40 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
13d50 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13d60 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
13d70 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
13d80 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
13d90 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
13da0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
13db0 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
13dc0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
13dd0 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
13de0 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
13df0 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66  e->pSem;..    if
13e00 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
13e10 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
13e20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
13e30 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
13e40 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
13e50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13e60 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13e70 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13e80 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
13e90 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
13ea0 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  );.        store
13eb0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
13ec0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
13ed0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
13ee0 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
13ef0 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68   has the lock wh
13f00 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f  en we are in NO_
13f10 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20  LOCK */.        
13f20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c  reserved = (pFil
13f30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53  e->eFileLock < S
13f40 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
13f50 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
13f60 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
13f70 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
13f80 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
13f90 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
13fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
13fb0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
13fc0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
13fd0 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
13fe0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
13ff0 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
14000 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
14010 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
14020 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
14030 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
14040 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
14050 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
14060 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
14070 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
14080 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
14090 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
140a0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
140b0 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
140c0 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
140d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
140e0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
140f0 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
14100 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
14110 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
14120 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
14130 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
14140 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
14150 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
14160 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
14170 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
14180 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
14190 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
141a0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
141b0 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
141c0 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
141d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
141e0 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
141f0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
14200 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
14210 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
14220 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
14230 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
14240 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
14250 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
14260 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
14270 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14280 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
14290 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
142a0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
142b0 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
142c0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
142d0 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
142e0 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  s only really su
142f0 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
14300 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
14310 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
14320 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
14330 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
14340 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
14350 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
14360 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
14370 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
14380 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
14390 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
143a0 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
143b0 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
143c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
143d0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
143e0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
143f0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
14400 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
14410 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
14420 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
14430 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
14440 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  XLock(sqlite3_fi
14450 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
14460 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
14470 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14480 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
14490 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
144a0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
144b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
144c0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20  TE_OK;..  /* if 
144d0 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
144e0 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
144f0 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
14500 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
14510 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
14520 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
14530 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
14540 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
14550 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
14560 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
14570 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  k;.    rc = SQLI
14580 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
14590 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
145a0 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73  }.  .  /* lock s
145b0 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74  emaphore now but
145c0 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61   bail out when a
145d0 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a  lready locked. *
145e0 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77  /.  if( sem_tryw
145f0 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
14600 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14610 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
14620 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
14630 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  }..  /* got it, 
14640 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
14650 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
14660 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14670 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20   = eFileLock;.. 
14680 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
14690 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
146a0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
146b0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
146c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
146d0 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
146e0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
146f0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
14700 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
14710 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
14720 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
14730 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
14740 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
14750 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
14760 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
14770 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
14780 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14790 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
147a0 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f  tic int semXUnlo
147b0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
147c0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
147d0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
147e0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
147f0 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
14800 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
14810 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
14820 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
14830 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
14840 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
14850 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
14860 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
14870 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14880 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
14890 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
148a0 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64  leLock, osGetpid
148b0 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (0)));.  assert(
148c0 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
148d0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
148e0 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
148f0 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
14900 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
14910 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
14920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14930 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
14940 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
14950 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
14960 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
14970 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
14980 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
14990 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
149a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
149b0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
149c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
149d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
149e0 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f   no, really unlo
149f0 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65  ck. */.  if ( se
14a00 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31  m_post(pSem)==-1
14a10 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
14a20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
14a30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14a40 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
14a50 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
14a60 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
14a70 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
14a80 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
14a90 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
14aa0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
14ab0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  o);.    }.    re
14ac0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
14ad0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14ae0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
14af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14b00 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20  }../*. ** Close 
14b10 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74  a file.. */.stat
14b20 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65  ic int semXClose
14b30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14b40 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
14b50 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
14b60 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14b70 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e  *)id;.    semXUn
14b80 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
14b90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14ba0 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
14bb0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
14bc0 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
14bd0 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75  fo(pFile);.    u
14be0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
14bf0 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
14c00 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
14c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14c20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
14c30 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a  VXWORKS */./*.**
14c40 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
14c50 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
14c60 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78   available on Vx
14c70 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  Works..**.******
14c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
14c90 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
14ca0 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  hore lock implem
14cb0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
14cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
14cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d10 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
14d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
14d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d80 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46  ******* Begin AF
14d90 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  P Locking ******
14da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
14dc0 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70  * AFP is the App
14dd0 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63  le Filing Protoc
14de0 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65  ol.  AFP is a ne
14df0 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d  twork filesystem
14e00 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70   found.** on App
14e10 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d  le Macintosh com
14e20 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53  puters - both OS
14e30 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a  9 and OSX..**.**
14e40 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70   Third-party imp
14e50 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
14e60 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c  AFP are availabl
14e70 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64  e.  But this cod
14e80 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77  e here.** only w
14e90 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a  orks on OSX..*/.
14ea0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
14eb0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
14ec0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
14ed0 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _STYLE./*.** The
14ee0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14ef0 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
14f00 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
14f10 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
14f20 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
14f30 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
14f40 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67  ntext afpLocking
14f50 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
14f60 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
14f70 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  t {.  int reserv
14f80 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed;.  const char
14f90 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
14fa0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
14fb0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
14fc0 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  /.};..struct Byt
14fd0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
14fe0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
14ff0 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
15000 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
15010 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
15020 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
15030 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
15040 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
15050 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
15060 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
15070 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
15080 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
15090 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
150a0 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
150b0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
150c0 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
150d0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
150e0 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
150f0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
15100 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
15110 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
15120 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
15130 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
15140 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
15150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15160 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
15170 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
15180 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
15190 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
151a0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
151b0 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
151c0 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
151d0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
151e0 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  2)../*.** This i
151f0 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20  s a utility for 
15200 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72  setting or clear
15210 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20  ing a bit-range 
15220 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46  lock on an.** AF
15230 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a  P filesystem..**
15240 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49   .** Return SQLI
15250 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
15260 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
15270 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
15280 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f  tic int afpSetLo
15290 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
152a0 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20   *path,         
152b0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
152c0 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
152d0 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65  ocked or unlocke
152e0 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  d */.  unixFile 
152f0 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
15300 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
15310 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
15320 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67   path */.  unsig
15330 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
15340 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72  fset,     /* Fir
15350 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
15360 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cked */.  unsign
15370 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
15380 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  gth,     /* Numb
15390 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
153a0 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74  ock */.  int set
153b0 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20  LockFlag        
153c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
153d0 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61  to set lock.  Fa
153e0 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63  lse to clear loc
153f0 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
15400 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
15410 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b  2 pb;.  int err;
15420 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
15430 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
15440 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
15450 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
15460 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
15470 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
15480 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
15490 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
154a0 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28  h;.  .  OSTRACE(
154b0 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73  ("AFPSETLOCK [%s
154c0 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61  ] for %d%s in ra
154d0 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
154e0 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
154f0 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
15500 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66   pFile->h, (pb.f
15510 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d  d==-1?"[testval-
15520 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66  1]":""),.    off
15530 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20  set, length));. 
15540 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
15550 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
15560 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
15570 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
15580 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
15590 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72   rc;.    int tEr
155a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
155b0 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
155c0 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  TLOCK failed to 
155d0 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
155e0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
155f0 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f      path, tErrno
15600 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e  , strerror(tErrn
15610 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  o)));.#ifdef SQL
15620 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
15630 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
15640 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15650 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
15660 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
15670 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
15680 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15690 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61        setLockFla
156a0 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  g ? SQLITE_IOERR
156b0 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49  _LOCK : SQLITE_I
156c0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
156d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
156e0 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
156f0 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28  RRORS */.    if(
15700 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
15710 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  c) ){.      stor
15720 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
15730 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
15740 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
15750 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
15760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15770 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
15780 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
15790 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
157a0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
157b0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
157c0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
157d0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
157e0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
157f0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
15800 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
15810 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
15820 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
15830 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
15840 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
15850 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
15860 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
15870 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
15880 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
15890 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
158a0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
158b0 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
158c0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
158d0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
158e0 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
158f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15900 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
15910 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15920 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15930 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
15940 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
15950 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
15960 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
15970 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
15980 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
15990 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
159a0 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78  File );.  contex
159b0 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
159c0 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
159d0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
159e0 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e  .  if( context->
159f0 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
15a00 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20  *pResOut = 1;.  
15a10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15a20 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
15a30 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
15a40 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
15a50 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
15a60 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
15a70 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
15a80 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
15a90 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
15aa0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
15ab0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
15ac0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
15ad0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
15ae0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
15af0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
15b00 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
15b10 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
15b20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a  holds it..   */.
15b30 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
15b40 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74  ){.    /* lock t
15b50 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65  he RESERVED byte
15b60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
15b70 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
15b80 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
15b90 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
15ba0 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20  TE, 1,1);  .    
15bb0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c  if( SQLITE_OK==l
15bc0 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  rc ){.      /* i
15bd0 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
15be0 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73  n taking the res
15bf0 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  erved lock, unlo
15c00 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  ck it to restore
15c10 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
15c20 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a  iginal state */.
15c30 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53        lrc = afpS
15c40 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15c50 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
15c60 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
15c70 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20   0);.    } else 
15c80 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
15c90 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74   failed to get t
15ca0 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d  he lock then som
15cb0 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68  eone else must h
15cc0 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ave it */.      
15cd0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
15ce0 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
15cf0 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
15d00 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a  {.      rc=lrc;.
15d10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
15d20 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
15d30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
15d40 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
15d50 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
15d60 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
15d70 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65  ved));.  .  *pRe
15d80 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
15d90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15da0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
15db0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
15dc0 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
15dd0 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
15de0 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
15df0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
15e00 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
15e10 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
15e20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
15e30 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
15e40 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
15e50 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
15e60 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
15e70 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
15e80 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
15e90 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
15ea0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
15eb0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
15ec0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
15ed0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
15ee0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
15ef0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
15f00 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
15f10 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
15f20 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
15f30 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
15f40 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
15f50 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
15f60 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
15f70 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
15f80 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
15f90 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
15fa0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
15fb0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
15fc0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
15fd0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
15fe0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
15ff0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
16000 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
16010 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
16020 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
16030 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
16040 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
16050 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
16060 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
16070 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
16080 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
16090 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
160a0 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
160b0 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
160c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
160d0 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
160e0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
160f0 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  ileLock){.  int 
16100 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16110 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
16120 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
16130 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
16140 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
16150 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66  le->pInode;.  af
16160 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16170 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
16180 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
16190 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
161a0 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
161b0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
161c0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
161d0 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
161e0 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
161f0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16200 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16210 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
16220 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
16230 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
16240 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16250 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
16260 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
16270 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47  e->nShared , osG
16280 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f  etpid(0)));..  /
16290 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
162a0 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
162b0 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
162c0 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
162d0 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
162e0 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
162f0 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
16300 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
16310 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
16320 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
16330 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
16340 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
16350 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
16360 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
16370 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
16380 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
16390 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
163a0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
163b0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
163c0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
163d0 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
163e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
163f0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
16400 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
16410 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
16420 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
16430 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
16440 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
16450 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
16460 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
16470 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
16480 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
16490 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
164a0 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
164b0 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
164c0 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
164d0 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
164e0 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
164f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16500 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
16510 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
16520 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16530 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
16540 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
16550 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
16560 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
16570 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
16580 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16590 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
165a0 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
165b0 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
165c0 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
165d0 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
165e0 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
165f0 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
16600 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
16610 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
16620 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
16630 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
16640 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
16650 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
16660 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
16670 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
16680 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
16690 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
166a0 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
166b0 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
166c0 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
166d0 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
166e0 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
166f0 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
16700 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
16710 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20  HARED_LOCK)).   
16720 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
16730 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
16740 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
16750 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  ;.  }.  .  /* If
16760 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
16770 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
16780 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
16790 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
167a0 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
167b0 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
167c0 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
167d0 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
167e0 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
167f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16800 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
16810 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16820 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70  LOCK && .     (p
16830 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16840 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
16850 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
16860 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
16870 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
16880 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16890 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
168a0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
168b0 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
168c0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
168d0 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
168e0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
168f0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
16900 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
16910 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
16920 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
16930 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
16940 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a  _lock;.  }.    .
16950 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
16960 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
16970 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
16980 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
16990 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
169a0 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
169b0 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
169c0 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
169d0 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
169e0 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
169f0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  d..  */.  if( eF
16a00 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16a10 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
16a20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
16a30 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
16a40 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
16a50 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
16a60 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b  .    int failed;
16a70 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66  .    failed = af
16a80 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16a90 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16aa0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
16ab0 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
16ac0 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
16ad0 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20   = failed;.     
16ae0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16af0 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
16b00 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
16b10 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
16b20 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
16b30 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
16b40 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
16b50 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
16b60 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
16b70 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
16b80 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
16b90 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
16ba0 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32    int lrc1, lrc2
16bb0 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b  , lrc1Errno = 0;
16bc0 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61  .    long lk, ma
16bd0 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73  sk;.    .    ass
16be0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
16bf0 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ared==0 );.    a
16c00 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
16c10 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
16c20 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b         .    mask
16c30 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29   = (sizeof(long)
16c40 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49  ==8) ? LARGEST_I
16c50 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66  NT64 : 0x7ffffff
16c60 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  f;.    /* Now ge
16c70 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
16c80 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20  SHARED_LOCK */. 
16c90 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20     /* note that 
16ca0 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74  the quality of t
16cb0 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f  he randomness do
16cc0 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61  esn't matter tha
16cd0 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b  t much */.    lk
16ce0 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20   = random(); .  
16cf0 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
16d00 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73  Byte = (lk & mas
16d10 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  k)%(SHARED_SIZE 
16d20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d  - 1);.    lrc1 =
16d30 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16d40 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16d50 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  le, .          S
16d60 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
16d70 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
16d80 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49  1, 1);.    if( I
16d90 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
16da0 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31  1) ){.      lrc1
16db0 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c  Errno = pFile->l
16dc0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  astErrno;.    }.
16dd0 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
16de0 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
16df0 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72  G lock */.    lr
16e00 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c2 = afpSetLock(
16e10 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16e20 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
16e30 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
16e40 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43   .    if( IS_LOC
16e50 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20  K_ERROR(lrc1) ) 
16e60 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
16e70 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72  tErrno(pFile, lr
16e80 63 31 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  c1Errno);.      
16e90 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20  rc = lrc1;.     
16ea0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16eb0 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
16ec0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16ed0 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20  (lrc2) ){.      
16ee0 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20  rc = lrc2;.     
16ef0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16f00 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
16f10 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54  f( lrc1 != SQLIT
16f20 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72  E_OK ) {.      r
16f30 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20  c = lrc1;.    } 
16f40 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
16f50 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16f60 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
16f70 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16f80 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
16f90 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
16fa0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
16fb0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
16fc0 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
16fd0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
16fe0 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
16ff0 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
17000 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
17010 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
17020 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a   in this.     **
17030 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
17040 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
17050 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
17060 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17070 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
17080 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
17090 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
170a0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
170b0 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
170c0 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
170d0 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
170e0 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
170f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
17100 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
17110 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
17120 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20   failed = 0;.   
17130 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
17140 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
17150 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63      if (eFileLoc
17160 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  k >= RESERVED_LO
17170 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
17180 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45  leLock < RESERVE
17190 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
171a0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
171b0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
171c0 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
171d0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
171e0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
171f0 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
17200 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69  E, 1,1);.      i
17210 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20  f( !failed ){.  
17220 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
17230 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
17240 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17250 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46  f (!failed && eF
17260 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55  ileLock == EXCLU
17270 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
17280 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
17290 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
172a0 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
172b0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
172c0 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
172d0 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
172e0 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
172f0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
17300 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
17310 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
17320 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
17330 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  fpUnlock.      *
17340 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61  /.      if( !(fa
17350 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
17360 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17370 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
17380 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
173b0 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
173c0 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
173d0 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
173e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
173f0 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
17400 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
17410 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
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 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
17480 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
17490 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
174a0 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
174b0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
174c0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
174d0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
174e0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
174f0 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65  D_FIRST + pInode
17500 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
17510 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   1)) ){.        
17520 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74    /* Can't reest
17530 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
17540 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20  d lock.  Sqlite 
17550 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73  can't deal, this
17560 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
17570 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20   a critical I/O 
17580 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
17590 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
175a0 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c  = ((failed & SQL
175b0 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
175c0 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61  LITE_IOERR) ? fa
175d0 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20  iled2 : .       
175e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
175f0 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
17600 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
17610 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  d_lock;.        
17620 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  } .      }else{.
17630 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
17640 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
17650 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
17660 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
17670 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
17680 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
17690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
176a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
176b0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
176c0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
176d0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
176e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
176f0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
17700 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
17710 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17720 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
17730 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
17740 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
17750 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
17760 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
17770 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
17780 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
17790 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70     %d %s %s (afp
177a0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
177b0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
177c0 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
177d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
177e0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
177f0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
17800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
17810 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17820 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
17830 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
17840 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
17850 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
17860 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
17870 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
17880 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
17890 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
178a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
178b0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
178c0 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
178d0 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
178e0 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
178f0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
17900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
17910 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
17920 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
17930 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
17940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17950 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
17960 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
17970 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
17980 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61  nfo *pInode;.  a
17990 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
179a0 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
179b0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
179c0 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
179d0 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73  Context;.  int s
179e0 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23  kipShared = 0;.#
179f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
17a00 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c  T.  int h = pFil
17a10 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  e->h;.#endif..  
17a20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
17a30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
17a40 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
17a50 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
17a60 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
17a70 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
17a80 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
17a90 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
17aa0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
17ab0 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
17ac0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
17ad0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 70 69           osGetpi
17ae0 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72  d(0)));..  asser
17af0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
17b00 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
17b10 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
17b20 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock<=eFileLock )
17b30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17b40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
17b50 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
17b60 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
17b70 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
17b80 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
17b90 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
17ba0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17bb0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
17bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
17bd0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
17be0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17bf0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
17c00 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
17c10 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
17c20 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
17c30 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
17c40 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
17c50 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
17c60 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
17c70 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
17c80 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
17c90 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
17ca0 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
17cb0 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
17cc0 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
17cd0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
17ce0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
17cf0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
17d00 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
17d10 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
17d20 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
17d30 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
17d40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
17d50 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
17d60 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
17d70 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
17d80 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
17d90 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
17da0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
17db0 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
17dc0 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
17dd0 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
17de0 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
17df0 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
17e00 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
17e10 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
17e20 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
17e30 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
17e40 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e  sert( pFile->inN
17e50 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20  ormalWrite==0.  
17e60 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
17e70 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
17e80 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
17e90 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
17ea0 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c  g==1 );.    pFil
17eb0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
17ec0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
17ed0 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d   .    if( pFile-
17ee0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  >eFileLock==EXCL
17ef0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
17f00 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
17f10 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17f20 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
17f30 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44  ED_FIRST, SHARED
17f40 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20  _SIZE, 0);.     
17f50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17f60 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
17f70 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
17f80 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17f90 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  >1) ){.        /
17fa0 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c  * only re-establ
17fb0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
17fc0 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79  ock if necessary
17fd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
17fe0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
17ff0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
18000 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
18010 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
18020 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
18030 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18040 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
18050 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  , 1, 1);.      }
18060 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
18070 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a  skipShared = 1;.
18080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18090 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
180a0 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
180b0 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
180c0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
180d0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
180e0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
180f0 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
18100 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
18110 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  } .    if( rc==S
18120 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
18130 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45  e->eFileLock>=RE
18140 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63  SERVED_LOCK && c
18150 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
18160 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
18170 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
18180 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18190 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
181a0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
181b0 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20  ( !rc ){ .      
181c0 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
181d0 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  ved = 0; .      
181e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
181f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18200 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
18210 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
18220 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b  de->nShared>1)){
18230 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
18240 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
18250 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
18260 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
18270 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f  TE_OK && eFileLo
18280 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a  ck==NO_LOCK ){..
18290 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
182a0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
182b0 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61   counter.  Relea
182c0 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  se the lock usin
182d0 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63  g an.    ** OS c
182e0 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c  all only when al
182f0 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69  l threads in thi
18300 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68  s same process h
18310 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ave released.   
18320 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20   ** the lock..  
18330 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65    */.    unsigne
18340 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
18350 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
18360 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
18370 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
18380 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
18390 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
183a0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
183b0 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ){.      Simulat
183c0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
183d0 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
183e0 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
183f0 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
18400 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
18410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b  );.      if( !sk
18420 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ipShared ){.    
18430 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
18440 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
18450 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
18460 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30  edLockByte, 1, 0
18470 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18480 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
18490 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
184a0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
184b0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
184c0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
184d0 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
184e0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
184f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18500 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
18510 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
18520 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
18530 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
18540 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
18550 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
18560 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
18570 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
18580 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
18590 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
185a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
185b0 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ) pFile->eFileLo
185c0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
185d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
185e0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
185f0 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
18600 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
18610 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
18620 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
18630 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
18640 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
18650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
18660 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
18670 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
18680 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
18690 3b 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64  ;.  afpUnlock(id
186a0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e  , NO_LOCK);.  un
186b0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
186c0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
186d0 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
186e0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
186f0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
18700 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
18710 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
18720 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
18730 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
18740 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
18750 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
18760 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
18770 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
18780 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
18790 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61  tor to pInode->a
187a0 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c  Pending.  It wil
187b0 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
187c0 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20  ly closed when. 
187d0 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
187e0 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
187f0 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65      */.    setPe
18800 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
18810 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f    }.  releaseIno
18820 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
18830 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
18840 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
18850 65 78 74 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ext);.  rc = clo
18860 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
18870 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
18880 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
18890 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
188a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
188b0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
188c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
188d0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
188e0 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41  e above is the A
188f0 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
18900 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
18910 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
18920 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
18930 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
18940 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
18950 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
18960 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
18970 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64  lable.  If you d
18980 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72  on't compile for
18990 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65   a mac, then the
189a0 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56   "unix-afp".** V
189b0 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  FS is not availa
189c0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ble..**.********
189d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
189e0 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63  d of the AFP loc
189f0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
18a00 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
18a10 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
18a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a60 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
18a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ab0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ad0 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c  **** Begin NFS L
18ae0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
18af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b00 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65  *******/..#if de
18b10 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
18b20 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
18b30 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
18b40 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65  /*. ** Lower the
18b50 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
18b60 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
18b70 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
18b80 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
18b90 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  . ** must be eit
18ba0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
18bb0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a  HARED_LOCK.. **.
18bc0 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69   ** If the locki
18bd0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
18be0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18bf0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
18c00 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72   below. ** the r
18c10 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
18c20 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
18c30 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
18c40 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
18c50 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nfsUnlock(sqlite
18c60 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
18c70 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65  eFileLock){.  re
18c80 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
18c90 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
18ca0 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
18cb0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
18cc0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
18cd0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
18ce0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
18cf0 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
18d00 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
18d10 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
18d20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
18d30 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
18d40 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
18d50 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
18d60 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
18d70 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
18d80 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
18d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18da0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
18db0 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
18dc0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
18dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
18e30 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
18e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e90 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
18ea0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
18eb0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
18ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18ed0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
18ee0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
18ef0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
18f00 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
18f10 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
18f20 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
18f30 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
18f40 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
18f50 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
18f60 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
18f70 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
18f80 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
18f90 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
18fa0 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
18fb0 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
18fc0 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
18fd0 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
18fe0 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
18ff0 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
19000 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
19010 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
19020 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
19030 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
19040 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
19050 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
19060 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
19070 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
19080 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
19090 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
190a0 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
190b0 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
190c0 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
190d0 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
190e0 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
190f0 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
19100 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
19110 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
19120 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
19130 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
19140 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
19150 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
19160 41 44 0a 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72  AD.** in any for
19170 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65  m by default, we
19180 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
19190 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  t to define _XOP
191a0 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65  EN_SOURCE..** Se
191b0 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20  e tickets #2741 
191c0 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a  and #2681..**.**
191d0 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69   To avoid stompi
191e0 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c  ng the errno val
191f0 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72  ue on a failed r
19200 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ead the lastErrn
19210 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
19220 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
19230 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
19240 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e  t seekAndRead(un
19250 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  ixFile *id, sqli
19260 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
19270 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
19280 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t cnt){.  int go
19290 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d  t;.  int prior =
192a0 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65   0;.#if (!define
192b0 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
192c0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
192d0 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
192e0 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
192f0 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20   TIMER_START;.  
19300 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e  assert( cnt==(cn
19310 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20  t&0x1ffff) );.  
19320 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e 32 20  assert( id->h>2 
19330 29 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66  );.  do{.#if def
19340 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
19350 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61      got = osPrea
19360 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
19370 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
19380 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19390 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
193a0 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
193b0 50 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74  PREAD64).    got
193c0 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d   = osPread64(id-
193d0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
193e0 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
193f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
19400 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20   = -1 );.#else. 
19410 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c     newOffset = l
19420 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
19430 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
19440 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19450 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 20  or( newOffset = 
19460 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  -1 );.    if( ne
19470 77 4f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20  wOffset<0 ){.   
19480 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
19490 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  o((unixFile*)id,
194a0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72   errno);.      r
194b0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
194c0 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64      got = osRead
194d0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
194e0 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  t);.#endif.    i
194f0 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72  f( got==cnt ) br
19500 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74  eak;.    if( got
19510 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
19520 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20  errno==EINTR ){ 
19530 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75  got = 1; continu
19540 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72  e; }.      prior
19550 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 6f 72   = 0;.      stor
19560 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78  eLastErrno((unix
19570 46 69 6c 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f  File*)id,  errno
19580 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19590 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f      }else if( go
195a0 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  t>0 ){.      cnt
195b0 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f   -= got;.      o
195c0 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20  ffset += got;.  
195d0 20 20 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74      prior += got
195e0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 28  ;.      pBuf = (
195f0 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68  void*)(got + (ch
19600 61 72 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d  ar*)pBuf);.    }
19610 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30  .  }while( got>0
19620 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b   );.  TIMER_END;
19630 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
19640 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
19650 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20  lld %llu\n",.   
19660 20 20 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20           id->h, 
19670 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65  got+prior, offse
19680 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45  t-prior, TIMER_E
19690 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75  LAPSED));.  retu
196a0 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a  rn got+prior;.}.
196b0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
196c0 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
196d0 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
196e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
196f0 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
19700 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
19710 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
19720 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
19730 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
19740 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
19750 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74  nixRead(.  sqlit
19760 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
19770 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
19780 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
19790 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29  3_int64 offset.)
197a0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
197b0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
197c0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b  *)id;.  int got;
197d0 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
197e0 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
197f0 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
19800 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
19810 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
19820 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
19830 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
19840 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
19850 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
19860 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
19870 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
19880 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
19890 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
198a0 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
198b0 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  ( pFile->pUnused
198c0 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
198d0 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
198e0 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
198f0 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
19900 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
19910 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
19920 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
19930 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
19940 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
19950 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61  s read request a
19960 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
19970 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
19980 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
19990 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
199a0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
199b0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
199c0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
199d0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
199e0 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
199f0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
19a00 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
19a10 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
19a20 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
19a30 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  , amt);.      re
19a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19a50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19a60 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69   int nCopy = pFi
19a70 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
19a80 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d  ffset;.      mem
19a90 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
19aa0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
19ab0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
19ac0 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
19ad0 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
19ae0 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
19af0 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
19b00 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
19b10 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
19b20 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20  #endif..  got = 
19b30 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c  seekAndRead(pFil
19b40 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  e, offset, pBuf,
19b50 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74   amt);.  if( got
19b60 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74  ==amt ){.    ret
19b70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19b80 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30   }else if( got<0
19b90 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45   ){.    /* lastE
19ba0 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
19bb0 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72  AndRead */.    r
19bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19bd0 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  RR_READ;.  }else
19be0 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
19bf0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20  rrno(pFile, 0); 
19c00 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65    /* not a syste
19c10 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f  m error */.    /
19c20 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
19c30 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
19c40 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
19c50 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
19c60 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f  ((char*)pBuf)[go
19c70 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b  t], 0, amt-got);
19c80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19c90 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
19ca0 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EAD;.  }.}../*.*
19cb0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 65  * Attempt to see
19cc0 6b 20 74 68 65 20 66 69 6c 65 2d 64 65 73 63 72  k the file-descr
19cd0 69 70 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  iptor passed as 
19ce0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
19cf0 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74  nt to.** absolut
19d00 65 20 6f 66 66 73 65 74 20 69 4f 66 66 2c 20 74  e offset iOff, t
19d10 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77  hen attempt to w
19d20 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20  rite nBuf bytes 
19d30 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a 20  of data from.** 
19d40 70 42 75 66 20 74 6f 20 69 74 2e 20 49 66 20 61  pBuf to it. If a
19d50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
19d60 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 73 65  return -1 and se
19d70 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68 65  t *piErrno. Othe
19d80 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75 72  rwise, .** retur
19d90 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d  n the actual num
19da0 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
19db0 74 74 65 6e 20 28 77 68 69 63 68 20 6d 61 79 20  tten (which may 
19dc0 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20  be less than.** 
19dd0 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nBuf)..*/.static
19de0 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74   int seekAndWrit
19df0 65 46 64 28 0a 20 20 69 6e 74 20 66 64 2c 20 20  eFd(.  int fd,  
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e10 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
19e20 65 73 63 72 69 70 74 6f 72 20 74 6f 20 77 72 69  escriptor to wri
19e30 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69  te to */.  i64 i
19e40 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Off,            
19e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
19e60 6c 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67  le offset to beg
19e70 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
19e80 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
19e90 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
19ea0 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
19eb0 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72  from this buffer
19ec0 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   to the file */.
19ed0 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20    int nBuf,     
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ef0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
19f00 66 65 72 20 70 42 75 66 20 69 6e 20 62 79 74 65  fer pBuf in byte
19f10 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 72  s */.  int *piEr
19f20 72 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  rno             
19f30 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
19f40 72 72 6f 72 20 6e 75 6d 62 65 72 20 69 66 20 65  rror number if e
19f50 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 29  rror occurs */.)
19f60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  {.  int rc = 0; 
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f80 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
19f90 75 72 6e 65 64 20 62 79 20 73 79 73 74 65 6d 20  urned by system 
19fa0 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72  call */..  asser
19fb0 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26 30  t( nBuf==(nBuf&0
19fc0 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73  x1ffff) );.  ass
19fd0 65 72 74 28 20 66 64 3e 32 20 29 3b 0a 20 20 61  ert( fd>2 );.  a
19fe0 73 73 65 72 74 28 20 70 69 45 72 72 6e 6f 21 3d  ssert( piErrno!=
19ff0 30 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30  0 );.  nBuf &= 0
1a000 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f  x1ffff;.  TIMER_
1a010 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69  START;..#if defi
1a020 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
1a030 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f   do{ rc = (int)o
1a040 73 50 77 72 69 74 65 28 66 64 2c 20 70 42 75 66  sPwrite(fd, pBuf
1a050 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d  , nBuf, iOff); }
1a060 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
1a070 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
1a080 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
1a090 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
1a0a0 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69  rc = (int)osPwri
1a0b0 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e  te64(fd, pBuf, n
1a0c0 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c  Buf, iOff);}whil
1a0d0 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
1a0e0 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a  ==EINTR);.#else.
1a0f0 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53    do{.    i64 iS
1a100 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20  eek = lseek(fd, 
1a110 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b  iOff, SEEK_SET);
1a120 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
1a130 72 72 6f 72 28 20 69 53 65 65 6b 20 3d 20 2d 31  rror( iSeek = -1
1a140 20 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65 65   );.    if( iSee
1a150 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  k<0 ){.      rc 
1a160 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  = -1;.      brea
1a170 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  k;.    }.    rc 
1a180 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42  = osWrite(fd, pB
1a190 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68  uf, nBuf);.  }wh
1a1a0 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1a1b0 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e  no==EINTR );.#en
1a1c0 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44  dif..  TIMER_END
1a1d0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ;.  OSTRACE(("WR
1a1e0 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
1a1f0 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64  7lld %llu\n", fd
1a200 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45  , rc, iOff, TIME
1a210 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20  R_ELAPSED));..  
1a220 69 66 28 20 72 63 3c 30 20 29 20 2a 70 69 45 72  if( rc<0 ) *piEr
1a230 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72  rno = errno;.  r
1a240 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1a250 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1a260 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
1a270 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
1a280 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
1a290 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
1a2a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1a2b0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
1a2c0 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
1a2d0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
1a2e0 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
1a2f0 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
1a300 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
1a310 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1a320 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1a330 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1a340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1a350 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
1a360 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
1a370 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
1a380 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
1a390 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64    return seekAnd
1a3a0 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f  WriteFd(id->h, o
1a3b0 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74  ffset, pBuf, cnt
1a3c0 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , &id->lastErrno
1a3d0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  );.}.../*.** Wri
1a3e0 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
1a3f0 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
1a400 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1a410 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
1a420 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
1a430 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
1a440 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
1a450 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
1a460 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1a470 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
1a480 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
1a490 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1a4a0 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
1a4b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1a4c0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1a4d0 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
1a4e0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
1a4f0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
1a500 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
1a510 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1a520 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1a530 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1a540 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1a550 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1a560 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1a570 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1a580 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1a590 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1a5a0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1a5b0 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
1a5c0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1a5d0 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
1a5e0 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
1a5f0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
1a600 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
1a610 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1a620 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  TE_DEBUG.  /* If
1a630 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1a640 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1a650 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1a660 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1a670 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1a680 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1a690 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1a6a0 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1a6b0 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61  han a.  ** norma
1a6c0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1a6d0 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65   then record the
1a6e0 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64   fact that the d
1a6f0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73  atabase.  ** has
1a700 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
1a710 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1a720 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65  unter is modifie
1a730 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20  d, record that. 
1a740 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20   ** fact too..  
1a750 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1a760 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b  inNormalWrite ){
1a770 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
1a780 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68  date = 1;  /* Th
1a790 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1a7a0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
1a7b0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d      if( offset<=
1a7c0 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74  24 && offset+amt
1a7d0 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e  >=27 ){.      in
1a7e0 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72  t rc;.      char
1a7f0 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20   oldCntr[4];.   
1a800 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1a810 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1a820 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52     rc = seekAndR
1a830 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f  ead(pFile, 24, o
1a840 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20  ldCntr, 4);.    
1a850 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a860 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1a870 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d    if( rc!=4 || m
1a880 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26  emcmp(oldCntr, &
1a890 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34  ((char*)pBuf)[24
1a8a0 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20  -offset], 4)!=0 
1a8b0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1a8c0 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1a8d0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61  = 1;  /* The tra
1a8e0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1a8f0 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a   has changed */.
1a900 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a910 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
1a920 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41  fined(SQLITE_MMA
1a930 50 5f 52 45 41 44 57 52 49 54 45 29 20 26 26 20  P_READWRITE) && 
1a940 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1a950 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
1a960 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
1a970 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75   this write requ
1a980 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
1a990 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
1a9a0 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
1a9b0 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
1a9c0 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
1a9d0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
1a9e0 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
1a9f0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
1aa00 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
1aa10 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1aa20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38      memcpy(&((u8
1aa30 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
1aa40 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
1aa50 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20   pBuf, amt);.   
1aa60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1aa70 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1aa80 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
1aa90 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1aaa0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1aab0 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
1aac0 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1aad0 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
1aae0 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  Buf, nCopy);.   
1aaf0 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
1ab00 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
1ab10 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
1ab20 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
1ab30 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
1ab40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20  .  }.#endif. .  
1ab50 77 68 69 6c 65 28 20 28 77 72 6f 74 65 20 3d 20  while( (wrote = 
1ab60 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1ab70 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
1ab80 2c 20 61 6d 74 29 29 3c 61 6d 74 20 26 26 20 77  , amt))<amt && w
1ab90 72 6f 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d  rote>0 ){.    am
1aba0 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
1abb0 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b  offset += wrote;
1abc0 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
1abd0 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
1abe0 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74  ];.  }.  Simulat
1abf0 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65  eIOError(( wrote
1ac00 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b  =(-1), amt=1 ));
1ac10 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1ac20 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65  ullError(( wrote
1ac30 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20  =0, amt=1 ));.. 
1ac40 20 69 66 28 20 61 6d 74 3e 77 72 6f 74 65 20 29   if( amt>wrote )
1ac50 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
1ac60 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74  0 && pFile->last
1ac70 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b  Errno!=ENOSPC ){
1ac80 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  .      /* lastEr
1ac90 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
1aca0 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  ndWrite */.     
1acb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1acc0 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1acd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f  }else{.      sto
1ace0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1acf0 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20  e, 0); /* not a 
1ad00 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1ad10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ad20 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
1ad30 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1ad40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
1ad50 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
1ad60 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1ad70 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
1ad80 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
1ad90 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
1ada0 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
1adb0 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
1adc0 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
1add0 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
1ade0 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
1adf0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1ae00 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
1ae10 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
1ae20 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
1ae30 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20  /*.** We do not 
1ae40 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f  trust systems to
1ae50 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69   provide a worki
1ae60 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20  ng fdatasync(). 
1ae70 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68   Some do..** Oth
1ae80 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62  ers do no.  To b
1ae90 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20  e safe, we will 
1aea0 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28  stick with the (
1aeb0 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29  slightly slower)
1aec0 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20  .** fsync(). If 
1aed0 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f  you know that yo
1aee0 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  ur system does s
1aef0 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63  upport fdatasync
1af00 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a  () correctly,.**
1af10 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d   then simply com
1af20 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74  pile with -Dfdat
1af30 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 20  async=fdatasync 
1af40 6f 72 20 2d 44 48 41 56 45 5f 46 44 41 54 41 53  or -DHAVE_FDATAS
1af50 59 4e 43 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  YNC.*/.#if !defi
1af60 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26  ned(fdatasync) &
1af70 26 20 21 48 41 56 45 5f 46 44 41 54 41 53 59 4e  & !HAVE_FDATASYN
1af80 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61  C.# define fdata
1af90 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69  sync fsync.#endi
1afa0 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
1afb0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74  HAVE_FULLFSYNC t
1afc0 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69  o 0 or 1 dependi
1afd0 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
1afe0 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55   not.** the F_FU
1aff0 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73  LLFSYNC macro is
1b000 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c   defined.  F_FUL
1b010 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e  LFSYNC is curren
1b020 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69  tly.** only avai
1b030 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20  lable on Mac OS 
1b040 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75  X.  But that cou
1b050 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69  ld change..*/.#i
1b060 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43  fdef F_FULLFSYNC
1b070 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
1b080 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65  ULLFSYNC 1.#else
1b090 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
1b0a0 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69  ULLFSYNC 0.#endi
1b0b0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  f.../*.** The fs
1b0c0 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
1b0d0 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
1b0e0 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
1b0f0 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
1b100 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
1b110 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
1b120 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
1b130 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
1b140 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
1b150 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1b160 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
1b170 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
1b180 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
1b190 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
1b1a0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
1b1b0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
1b1c0 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
1b1d0 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
1b1e0 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
1b1f0 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
1b200 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1b210 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
1b220 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
1b230 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1b240 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
1b250 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
1b260 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
1b270 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
1b280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b290 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
1b2a0 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
1b2b0 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
1b2c0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1b2d0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
1b2e0 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
1b2f0 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
1b300 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
1b310 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
1b320 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
1b330 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
1b340 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
1b350 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
1b360 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
1b370 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
1b380 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
1b390 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
1b3a0 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
1b3b0 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
1b3c0 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1b3d0 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
1b3e0 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
1b3f0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
1b400 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
1b410 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
1b420 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1b430 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
1b440 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
1b450 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
1b460 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1b470 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
1b480 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
1b490 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
1b4a0 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
1b4b0 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
1b4c0 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
1b4d0 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
1b4e0 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
1b4f0 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
1b500 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
1b510 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
1b520 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
1b530 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
1b540 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
1b550 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
1b560 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
1b570 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
1b580 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
1b590 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
1b5a0 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
1b5b0 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
1b5c0 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
1b5d0 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
1b5e0 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
1b5f0 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
1b600 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1b610 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
1b620 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
1b630 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
1b640 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
1b650 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
1b660 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
1b670 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
1b680 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
1b690 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
1b6a0 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
1b6b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
1b6c0 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
1b6d0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1b6e0 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1b6f0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
1b700 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1b710 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1b720 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1b730 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
1b740 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
1b750 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b760 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
1b770 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b780 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1b790 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1b7a0 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
1b7b0 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
1b7c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
1b7d0 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
1b7e0 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
1b7f0 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
1b800 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
1b810 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
1b820 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
1b830 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
1b840 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
1b850 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1b860 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
1b870 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1b880 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
1b890 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
1b8a0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
1b8b0 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
1b8c0 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
1b8d0 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
1b8e0 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
1b8f0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
1b900 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
1b910 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20  s a.  ** no-op. 
1b920 20 42 75 74 20 67 6f 20 61 68 65 61 64 20 61 6e   But go ahead an
1b930 64 20 63 61 6c 6c 20 66 73 74 61 74 28 29 20 74  d call fstat() t
1b940 6f 20 76 61 6c 69 64 61 74 65 20 74 68 65 20 66  o validate the f
1b950 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
1b960 74 6f 72 20 61 73 20 77 65 20 6e 65 65 64 20 61  tor as we need a
1b970 20 6d 65 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f   method to provo
1b980 6b 65 20 61 20 66 61 69 6c 75 72 65 20 64 75 72  ke a failure dur
1b990 69 6e 67 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74  ing.  ** coverat
1b9a0 65 20 74 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a  e testing..  */.
1b9b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
1b9c0 5f 53 59 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74  _SYNC.  {.    st
1b9d0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
1b9e0 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28     rc = osFstat(
1b9f0 66 64 2c 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23  fd, &buf);.  }.#
1ba00 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1ba10 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  YNC.  if( fullSy
1ba20 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  nc ){.    rc = o
1ba30 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c  sFcntl(fd, F_FUL
1ba40 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65  LFSYNC, 0);.  }e
1ba50 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
1ba60 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65  .  }.  /* If the
1ba70 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65   FULLFSYNC faile
1ba80 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  d, fall back to 
1ba90 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73  attempting an fs
1baa0 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73  ync()..  ** It s
1bab0 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73  houldn't be poss
1bac0 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79  ible for fullfsy
1bad0 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68  nc to fail on th
1bae0 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69  e local .  ** fi
1baf0 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53  le system (on OS
1bb00 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69  X), so failure i
1bb10 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55  ndicates that FU
1bb20 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e  LLFSYNC.  ** isn
1bb30 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  't supported for
1bb40 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65   this file syste
1bb50 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61  m. So, attempt a
1bb60 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e  n fsync .  ** an
1bb70 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f  d (for now) igno
1bb80 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  re the overhead 
1bb90 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73  of a superfluous
1bba0 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20   fcntl call.  . 
1bbb0 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74   ** It'd be bett
1bbc0 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c  er to detect ful
1bbd0 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f  lfsync support o
1bbe0 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20  nce and avoid . 
1bbf0 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61   ** the fcntl ca
1bc00 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79  ll every time sy
1bc10 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20  nc is called..  
1bc20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63  */.  if( rc ) rc
1bc30 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23   = fsync(fd);..#
1bc40 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  elif defined(__A
1bc50 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61  PPLE__).  /* fda
1bc60 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b  tasync() on HFS+
1bc70 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75   doesn't yet flu
1bc80 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  sh the file size
1bc90 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63   if it changed c
1bca0 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f  orrectly.  ** so
1bcb0 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65   currently we de
1bcc0 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63  fault to the mac
1bcd0 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65  ro that redefine
1bce0 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66  s fdatasync to f
1bcf0 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  sync.  */.  rc =
1bd00 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73   fsync(fd);.#els
1bd10 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73  e .  rc = fdatas
1bd20 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f  ync(fd);.#if OS_
1bd30 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
1bd40 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ==-1 && errno==E
1bd50 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63  NOTSUP ){.    rc
1bd60 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20   = fsync(fd);.  
1bd70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
1bd80 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66  XWORKS */.#endif
1bd90 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45   /* ifdef SQLITE
1bda0 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41  _NO_SYNC elif HA
1bdb0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a  VE_FULLFSYNC */.
1bdc0 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b  .  if( OS_VXWORK
1bdd0 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a  S && rc!= -1 ){.
1bde0 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a      rc = 0;.  }.
1bdf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1be00 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
1be10 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1be20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1be30 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46  ntaining file zF
1be40 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73  ilename..** If s
1be50 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20  uccessful, *pFd 
1be60 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70  is set to the op
1be70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ened file descri
1be80 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  ptor and.** SQLI
1be90 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1bea0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
1beb0 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51  ccurs, either SQ
1bec0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72  LITE_NOMEM.** or
1bed0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1bee0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1bef0 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1bf00 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20  an undefined.** 
1bf10 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  value..**.** The
1bf20 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
1bf30 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 75 73  descriptor is us
1bf40 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20  ed for only one 
1bf50 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73  thing - to.** fs
1bf60 79 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f 72  ync() a director
1bf70 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66  y to make sure f
1bf80 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64  ile creation and
1bf90 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73   deletion events
1bfa0 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20  .** are flushed 
1bfb0 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66  to disk.  Such f
1bfc0 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65  syncs are not ne
1bfd0 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a  eded on newer.**
1bfe0 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65   journaling file
1bff0 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65  systems, but are
1c000 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64   required on old
1c010 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a  er filesystems..
1c020 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1c030 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  ne can be overri
1c040 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78  dden using the x
1c050 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72  SetSysCall inter
1c060 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69  face..** The abi
1c070 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65  lity to override
1c080 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1c090 73 20 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f  s added in suppo
1c0a0 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72  rt of the.** chr
1c0b0 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20  omium sandbox.  
1c0c0 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74  Opening a direct
1c0d0 6f 72 79 20 69 73 20 61 20 73 65 63 75 72 69 74  ory is a securit
1c0e0 79 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a  y risk (we are.*
1c0f0 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e  * told) so makin
1c100 67 20 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c  g it overrideabl
1c110 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72  e allows the chr
1c120 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f  omium sandbox to
1c130 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73  .** replace this
1c140 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
1c150 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20  harmless no-op. 
1c160 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f   To make this ro
1c170 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  utine.** a no-op
1c180 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74  , replace it wit
1c190 68 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65  h a stub that re
1c1a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
1c1b0 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70  but leaves.** *p
1c1c0 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61  Fd set to a nega
1c1d0 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  tive number..**.
1c1e0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1c1f0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1c200 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
1c210 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69  nsible for closi
1c220 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  ng.** the file d
1c230 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75  escriptor *pFd u
1c240 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f  sing close()..*/
1c250 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
1c260 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
1c270 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1c280 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e   int *pFd){.  in
1c290 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d  t ii;.  int fd =
1c2a0 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72   -1;.  char zDir
1c2b0 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
1c2c0 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E+1];..  sqlite3
1c2d0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
1c2e0 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65  THNAME, zDirname
1c2f0 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  , "%s", zFilenam
1c300 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e  e);.  for(ii=(in
1c310 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d  t)strlen(zDirnam
1c320 65 29 3b 20 69 69 3e 30 20 26 26 20 7a 44 69 72  e); ii>0 && zDir
1c330 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69  name[ii]!='/'; i
1c340 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30  i--);.  if( ii>0
1c350 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65   ){.    zDirname
1c360 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  [ii] = '\0';.  }
1c370 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 7a 44  else{.    if( zD
1c380 69 72 6e 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29  irname[0]!='/' )
1c390 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27   zDirname[0] = '
1c3a0 2e 27 3b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65  .';.    zDirname
1c3b0 5b 31 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66  [1] = 0;.  }.  f
1c3c0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
1c3d0 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
1c3e0 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b  LY|O_BINARY, 0);
1c3f0 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a  .  if( fd>=0 ){.
1c400 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
1c410 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22  ENDIR %-3d %s\n"
1c420 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29  , fd, zDirname))
1c430 3b 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66  ;.  }.  *pFd = f
1c440 64 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29  d;.  if( fd>=0 )
1c450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c460 4b 3b 0a 20 20 72 65 74 75 72 6e 20 75 6e 69 78  K;.  return unix
1c470 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1c480 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
1c490 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20  openDirectory", 
1c4a0 7a 44 69 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  zDirname);.}../*
1c4b0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
1c4c0 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
1c4d0 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
1c4e0 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
1c4f0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  isk..**.** If da
1c500 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62  taOnly==0 then b
1c510 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73  oth the file its
1c520 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61  elf and its meta
1c530 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69  data (file.** si
1c540 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c  ze, access time,
1c550 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64   etc) are synced
1c560 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d  .  If dataOnly!=
1c570 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a  0 then only the.
1c580 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20  ** file data is 
1c590 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e  synced..**.** Un
1c5a0 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d  der Unix, also m
1c5b0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1c5c0 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1c5d0 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a  y for the file.*
1c5e0 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  * has been creat
1c5f0 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20  ed by fsync-ing 
1c600 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
1c610 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1c620 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64  file..** If we d
1c630 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e  o not do this an
1c640 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61  d we encounter a
1c650 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
1c660 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
1c670 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
1c680 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
1c690 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20   exist after we 
1c6a0 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78  reboot.  The nex
1c6b0 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61  t.** SQLite to a
1c6c0 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77  ccess the file w
1c6d0 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61  ill not know tha
1c6e0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78  t the journal ex
1c6f0 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a  ists (because.**
1c700 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
1c710 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
1c720 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63  rnal was never c
1c730 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20  reated) and the 
1c740 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
1c750 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63  ill not roll bac
1c760 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61  k - possibly lea
1c770 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
1c780 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
1c790 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1c7a0 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
1c7b0 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
1c7c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
1c7d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1c7e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
1c7f0 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79    int isDataOnly
1c800 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45   = (flags&SQLITE
1c810 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b  _SYNC_DATAONLY);
1c820 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e  .  int isFullsyn
1c830 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29  c = (flags&0x0F)
1c840 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1c850 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  LL;..  /* Check 
1c860 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
1c870 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
1c880 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
1c890 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
1c8a0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1c8b0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
1c8c0 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
1c8d0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1c8e0 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f  C_FULL.  );..  /
1c8f0 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
1c900 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
1c910 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1c920 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
1c930 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
1c940 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
1c950 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
1c960 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
1c970 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
1c980 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
1c990 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1c9a0 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73  TE_FULL );..  as
1c9b0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
1c9c0 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
1c9d0 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
1c9e0 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66  e->h));.  rc = f
1c9f0 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
1ca00 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20  >h, isFullsync, 
1ca10 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53  isDataOnly);.  S
1ca20 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1ca30 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1ca40 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
1ca50 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
1ca60 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
1ca70 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1ca80 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
1ca90 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20  , "full_fsync", 
1caa0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1cab0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73   }..  /* Also fs
1cac0 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72  ync the director
1cad0 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
1cae0 20 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52   file if the DIR
1caf0 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69  SYNC flag.  ** i
1cb00 73 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20  s set.  This is 
1cb10 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72  a one-time occur
1cb20 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73  rence.  Many sys
1cb30 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20  tems (examples: 
1cb40 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e  AIX).  ** are un
1cb50 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20  able to fsync a 
1cb60 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67  directory, so ig
1cb70 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74  nore errors on t
1cb80 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20  he fsync..  */. 
1cb90 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
1cba0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
1cbb0 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20  _DIRSYNC ){.    
1cbc0 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f  int dirfd;.    O
1cbd0 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43  STRACE(("DIRSYNC
1cbe0 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73   %s (have_fullfs
1cbf0 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
1cc00 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a  %d)\n", pFile->z
1cc10 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20  Path,.          
1cc20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
1cc30 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a  , isFullsync));.
1cc40 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
1cc50 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e  irectory(pFile->
1cc60 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
1cc70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cc80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
1cc90 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c  ull_fsync(dirfd,
1cca0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f   0, 0);.      ro
1ccb0 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
1ccc0 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
1ccd0 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  _);.    }else{. 
1cce0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
1ccf0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
1cd00 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   );.      rc = S
1cd10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1cd20 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
1cd30 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c  lags &= ~UNIXFIL
1cd40 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20  E_DIRSYNC;.  }. 
1cd50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cd60 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
1cd70 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
1cd80 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
1cd90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1cda0 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  xTruncate(sqlite
1cdb0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1cdc0 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69  nByte){.  unixFi
1cdd0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1cde0 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
1cdf0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
1ce00 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
1ce10 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1ce20 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1ce30 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f  TRUNCATE );..  /
1ce40 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
1ce50 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
1ce60 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
1ce70 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
1ce80 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
1ce90 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
1cea0 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
1ceb0 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
1cec0 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
1ced0 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
1cee0 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
1cef0 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
1cf00 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
1cf10 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
1cf20 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
1cf30 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
1cf40 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
1cf50 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
1cf60 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
1cf70 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1cf80 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1cf90 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73   }..  rc = robus
1cfa0 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
1cfb0 65 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20  e->h, nByte);.  
1cfc0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74  if( rc ){.    st
1cfd0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1cfe0 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
1cff0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1d000 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1d010 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1d020 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1d030 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
1d040 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1d050 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  BUG.    /* If we
1d060 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1d070 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1d080 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1d090 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20   opposed to.    
1d0a0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1d0b0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1d0c0 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1d0d0 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1d0e0 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d  an a.    ** norm
1d0f0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1d100 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74  ) and we truncat
1d110 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1d120 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a  ro length,.    *
1d130 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65  * that effective
1d140 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1d150 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20  hange counter.  
1d160 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1d170 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65  n.    ** when re
1d180 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61  storing a databa
1d190 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  se using the bac
1d1a0 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a  kup API from a z
1d1b0 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ero-length.    *
1d1c0 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f  * source..    */
1d1d0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1d1e0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
1d1f0 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1d200 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1d210 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
1d220 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53   }.#endif..#if S
1d230 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1d240 49 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20  IZE>0.    /* If 
1d250 74 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73  the file was jus
1d260 74 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61  t truncated to a
1d270 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68   size smaller th
1d280 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  an the currently
1d290 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72  .    ** mapped r
1d2a0 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68  egion, reduce th
1d2b0 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70  e effective mapp
1d2c0 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c  ing size as well
1d2d0 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20  . SQLite will.  
1d2e0 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20    ** use read() 
1d2f0 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61  and write() to a
1d300 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e  ccess data beyon
1d310 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f  d this point fro
1d320 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20  m now on.  .    
1d330 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  */.    if( nByte
1d340 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
1d350 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1d360 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74  >mmapSize = nByt
1d370 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  e;.    }.#endif.
1d380 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d390 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
1d3a0 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
1d3b0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1d3c0 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
1d3d0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
1d3e0 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c  unixFileSize(sql
1d3f0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1d400 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
1d410 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
1d420 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
1d430 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20  t( id );.  rc = 
1d440 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69  osFstat(((unixFi
1d450 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
1d460 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1d470 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
1d480 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1d490 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1d4a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65  (unixFile*)id, e
1d4b0 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  rrno);.    retur
1d4c0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1d4d0 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
1d4e0 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
1d4f0 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65  ;..  /* When ope
1d500 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65  ning a zero-size
1d510 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
1d520 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70  indInodeInfo() p
1d530 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72  rocedure.  ** wr
1d540 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79  ites a single by
1d550 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c  te into that fil
1d560 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f  e in order to wo
1d570 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a  rk around a bug.
1d580 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58    ** in the OS-X
1d590 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
1d5a0 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  m.  In order to 
1d5b0 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77  avoid problems w
1d5c0 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c  ith upper.  ** l
1d5d0 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74  ayers, we need t
1d5e0 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69  o report this fi
1d5f0 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20  le size as zero 
1d600 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
1d610 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e  s.  ** really 1.
1d620 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e     Ticket #3260.
1d630 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69  .  */.  if( *pSi
1d640 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d  ze==1 ) *pSize =
1d650 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53   0;...  return S
1d660 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1d670 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1d680 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1d690 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1d6a0 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72  _)./*.** Handler
1d6b0 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69   for proxy-locki
1d6c0 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ng file-control 
1d6d0 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20  verbs.  Defined 
1d6e0 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20  below in the.** 
1d6f0 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67  proxying locking
1d700 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74   division..*/.st
1d710 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69  atic int proxyFi
1d720 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1d730 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64  3_file*,int,void
1d740 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a  *);.#endif../* .
1d750 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d760 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61   is called to ha
1d770 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f  ndle the SQLITE_
1d780 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
1d790 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  .** file-control
1d7a0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c   operation.  Enl
1d7b0 61 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73  arge the databas
1d7c0 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73  e to nBytes in s
1d7d0 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20  ize.** (rounded 
1d7e0 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  up to the next c
1d7f0 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20  hunk-size).  If 
1d800 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1d810 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65  already.** nByte
1d820 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69  s or larger, thi
1d830 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1d840 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1d850 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  int fcntlSizeHin
1d860 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  t(unixFile *pFil
1d870 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  e, i64 nByte){. 
1d880 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1d890 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34  unk>0 ){.    i64
1d8a0 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
1d8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d8c0 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
1d8d0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
1d8e0 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20  tat buf;        
1d8f0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
1d900 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c   hold return val
1d910 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a  ues of fstat() *
1d920 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73  /.   .    if( os
1d930 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
1d940 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72  &buf) ){.      r
1d950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1d960 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
1d970 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e  .    nSize = ((n
1d980 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68  Byte+pFile->szCh
1d990 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e  unk-1) / pFile->
1d9a0 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
1d9b0 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69  ->szChunk;.    i
1d9c0 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75  f( nSize>(i64)bu
1d9d0 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69  f.st_size ){..#i
1d9e0 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
1d9f0 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
1da00 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
1da10 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a  LLOCATE.      /*
1da20 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20   The code below 
1da30 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20  is handling the 
1da40 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
1da50 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20  osFallocate() . 
1da60 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c       ** correctl
1da70 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  y. posix_falloca
1da80 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  te() is defined 
1da90 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f  to "returns zero
1daa0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20   on success, .  
1dab0 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72      ** or an err
1dac0 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61  or number on  fa
1dad0 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20  ilure". See the 
1dae0 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61  manpage for deta
1daf0 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ils. */.      in
1db00 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b  t err;.      do{
1db10 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f  .        err = o
1db20 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65  sFallocate(pFile
1db30 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65  ->h, buf.st_size
1db40 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73  , nSize-buf.st_s
1db50 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ize);.      }whi
1db60 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29  le( err==EINTR )
1db70 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20  ;.      if( err 
1db80 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1db90 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c  IOERR_WRITE;.#el
1dba0 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  se.      /* If t
1dbb0 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68  he OS does not h
1dbc0 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ave posix_falloc
1dbd0 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20  ate(), fake it. 
1dbe0 57 72 69 74 65 20 61 20 0a 20 20 20 20 20 20 2a  Write a .      *
1dbf0 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  * single byte to
1dc00 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 69   the last byte i
1dc10 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 74 68 61  n each block tha
1dc20 74 20 66 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79  t falls entirely
1dc30 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69 6e  .      ** within
1dc40 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
1dc50 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72  gion. Then, if r
1dc60 65 71 75 69 72 65 64 2c 20 61 20 73 69 6e 67 6c  equired, a singl
1dc70 65 20 62 79 74 65 0a 20 20 20 20 20 20 2a 2a 20  e byte.      ** 
1dc80 61 74 20 6f 66 66 73 65 74 20 28 6e 53 69 7a 65  at offset (nSize
1dc90 2d 31 29 2c 20 74 6f 20 73 65 74 20 74 68 65 20  -1), to set the 
1dca0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1dcb0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20 20   correctly..    
1dcc0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73    ** This is a s
1dcd0 69 6d 69 6c 61 72 20 74 65 63 68 6e 69 71 75 65  imilar technique
1dce0 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 62 79   to that used by
1dcf0 20 67 6c 69 62 63 20 6f 6e 20 73 79 73 74 65 6d   glibc on system
1dd00 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
1dd10 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65  do not have a re
1dd20 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 63  al fallocate() c
1dd30 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  all..      */.  
1dd40 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62      int nBlk = b
1dd50 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20  uf.st_blksize;  
1dd60 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62  /* File-system b
1dd70 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20  lock size */.   
1dd80 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20     int nWrite = 
1dd90 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1dda0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1ddb0 73 20 77 72 69 74 74 65 6e 20 62 79 20 73 65 65  s written by see
1ddc0 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
1ddd0 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20     i64 iWrite;  
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ddf0 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f  * Next offset to
1de00 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20   write to */..  
1de10 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 62 75      iWrite = (bu
1de20 66 2e 73 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a  f.st_size/nBlk)*
1de30 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b  nBlk + nBlk - 1;
1de40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1de50 57 72 69 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69  Write>=buf.st_si
1de60 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
1de70 72 74 28 20 28 28 69 57 72 69 74 65 2b 31 29 25  rt( ((iWrite+1)%
1de80 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  nBlk)==0 );.    
1de90 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b    for(/*no-op*/;
1dea0 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 2b 6e 42   iWrite<nSize+nB
1deb0 6c 6b 2d 31 3b 20 69 57 72 69 74 65 2b 3d 6e 42  lk-1; iWrite+=nB
1dec0 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  lk ){.        if
1ded0 28 20 69 57 72 69 74 65 3e 3d 6e 53 69 7a 65 20  ( iWrite>=nSize 
1dee0 29 20 69 57 72 69 74 65 20 3d 20 6e 53 69 7a 65  ) iWrite = nSize
1def0 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 57   - 1;.        nW
1df00 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rite = seekAndWr
1df10 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74  ite(pFile, iWrit
1df20 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20  e, "", 1);.     
1df30 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31     if( nWrite!=1
1df40 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1df50 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1df60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1df70 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49   }.  }..#if SQLI
1df80 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1df90 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  >0.  if( pFile->
1dfa0 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26 26  mmapSizeMax>0 &&
1dfb0 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d   nByte>pFile->mm
1dfc0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e  apSize ){.    in
1dfd0 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46  t rc;.    if( pF
1dfe0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20  ile->szChunk<=0 
1dff0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  ){.      if( rob
1e000 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1e010 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29  ile->h, nByte) )
1e020 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
1e030 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
1e040 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  errno);.        
1e050 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1e060 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1e070 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1e080 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1e090 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
1e0a0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75     }..    rc = u
1e0b0 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
1e0c0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65  , nByte);.    re
1e0d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
1e0e0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  dif..  return SQ
1e0f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1e100 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e  * If *pArg is in
1e110 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
1e120 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
1e130 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
1e140 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
1e150 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
1e160 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
1e170 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
1e180 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
1e190 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
1e1a0 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
1e1b0 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
1e1c0 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
1e1d0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
1e1e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
1e1f0 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c  xModeBit(unixFil
1e200 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e  e *pFile, unsign
1e210 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e  ed char mask, in
1e220 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20  t *pArg){.  if( 
1e230 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a  *pArg<0 ){.    *
1e240 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63  pArg = (pFile->c
1e250 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29  trlFlags & mask)
1e260 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  !=0;.  }else if(
1e270 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20   (*pArg)==0 ){. 
1e280 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1e290 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ags &= ~mask;.  
1e2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
1e2b0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d  ->ctrlFlags |= m
1e2c0 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46  ask;.  }.}../* F
1e2d0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1e2e0 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
1e2f0 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
1e300 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
1e310 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49  *zBuf);../*.** I
1e320 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
1e330 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65  ontrol of an ope
1e340 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
1e350 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1e360 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  xFileControl(sql
1e370 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1e380 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1e390 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  g){.  unixFile *
1e3a0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1e3b0 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28  e*)id;.  switch(
1e3c0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1e3d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
1e3e0 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
1e3f0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1e400 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ile->eFileLock;.
1e410 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e420 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e430 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e440 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  NTL_LAST_ERRNO: 
1e450 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1e460 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  Arg = pFile->las
1e470 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65  tErrno;.      re
1e480 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e490 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1e4a0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
1e4b0 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
1e4c0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
1e4d0 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
1e4e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e4f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1e500 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1e510 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a  TL_SIZE_HINT: {.
1e520 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
1e530 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1e540 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1e550 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69      rc = fcntlSi
1e560 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28  zeHint(pFile, *(
1e570 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20  i64 *)pArg);.   
1e580 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1e590 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1e5a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e5b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1e5c0 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
1e5d0 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75  T_WAL: {.      u
1e5e0 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  nixModeBit(pFile
1e5f0 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  , UNIXFILE_PERSI
1e600 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
1e610 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
1e620 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e630 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1e640 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
1e650 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a  FE_OVERWRITE: {.
1e660 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69        unixModeBi
1e670 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c  t(pFile, UNIXFIL
1e680 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41  E_PSOW, (int*)pA
1e690 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
1e6a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e6b0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1e6c0 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
1e6d0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72  : {.      *(char
1e6e0 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
1e6f0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
1e700 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61  pFile->pVfs->zNa
1e710 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
1e720 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e730 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1e740 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
1e750 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63  ENAME: {.      c
1e760 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71  har *zTFile = sq
1e770 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
1e780 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50  pFile->pVfs->mxP
1e790 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20  athname );.     
1e7a0 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20   if( zTFile ){. 
1e7b0 20 20 20 20 20 20 20 75 6e 69 78 47 65 74 54 65         unixGetTe
1e7c0 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56  mpname(pFile->pV
1e7d0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
1e7e0 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  zTFile);.       
1e7f0 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
1e800 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d   zTFile;.      }
1e810 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e820 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1e830 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1e840 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20  CNTL_HAS_MOVED: 
1e850 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1e860 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76  Arg = fileHasMov
1e870 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ed(pFile);.     
1e880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e890 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  K;.    }.#if SQL
1e8a0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1e8b0 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c  E>0.    case SQL
1e8c0 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
1e8d0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34  IZE: {.      i64
1e8e0 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36   newLimit = *(i6
1e8f0 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  4*)pArg;.      i
1e900 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e910 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  K;.      if( new
1e920 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f  Limit>sqlite3Glo
1e930 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
1e940 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c   ){.        newL
1e950 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c  imit = sqlite3Gl
1e960 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
1e970 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
1e980 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70   *(i64*)pArg = p
1e990 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1e9a0 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  x;.      if( new
1e9b0 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c  Limit>=0 && newL
1e9c0 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61  imit!=pFile->mma
1e9d0 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c  pSizeMax && pFil
1e9e0 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  e->nFetchOut==0 
1e9f0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1ea00 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
1ea10 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  newLimit;.      
1ea20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
1ea30 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20  pSize>0 ){.     
1ea40 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69       unixUnmapfi
1ea50 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  le(pFile);.     
1ea60 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61       rc = unixMa
1ea70 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29  pfile(pFile, -1)
1ea80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ea90 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1eaa0 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   rc;.    }.#endi
1eab0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1eac0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65  DEBUG.    /* The
1ead0 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69   pager calls thi
1eae0 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e  s method to sign
1eaf0 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64  al that it has d
1eb00 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c  one.    ** a rol
1eb10 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74  lback and that t
1eb20 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74  he database is t
1eb30 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67  herefore unchang
1eb40 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74  ed and.    ** it
1eb50 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20   hence it is OK 
1eb60 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  for the transact
1eb70 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ion change count
1eb80 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  er to be.    ** 
1eb90 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a  unchanged..    *
1eba0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1ebb0 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1ebc0 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28  NGED: {.      ((
1ebd0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64  unixFile*)id)->d
1ebe0 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
1ebf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ec00 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
1ec10 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1ec20 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1ec30 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1ec40 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65  PPLE__).    case
1ec50 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45   SQLITE_FCNTL_SE
1ec60 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1ec70 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ec80 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50  _FCNTL_GET_LOCKP
1ec90 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
1eca0 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69    return proxyFi
1ecb0 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c  leControl(id,op,
1ecc0 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pArg);.    }.#en
1ecd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1ece0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1ecf0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1ed00 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a  APPLE__) */.  }.
1ed10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ed20 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a  NOTFOUND;.}../*.
1ed30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
1ed40 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
1ed50 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
1ed60 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
1ed70 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
1ed80 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
1ed90 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
1eda0 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
1edb0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
1edc0 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
1edd0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
1ede0 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
1edf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
1ee00 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
1ee10 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
1ee20 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
1ee30 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
1ee40 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
1ee50 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
1ee60 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
1ee70 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
1ee80 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
1ee90 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
1eea0 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
1eeb0 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66  for both..*/.#if
1eec0 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20  ndef __QNXNTO__ 
1eed0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1eee0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1eef0 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
1ef00 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1ef10 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1ef20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ef30 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
1ef40 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  IZE;.}.#endif../
1ef50 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1ef60 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66 20 75 6e  ng version of un
1ef70 69 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  ixSectorSize() i
1ef80 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72 20  s optimized for 
1ef90 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  QNX..*/.#ifdef _
1efa0 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75  _QNXNTO__.#inclu
1efb0 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b  de <sys/dcmd_blk
1efc0 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
1efd0 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61  s/statvfs.h>.sta
1efe0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
1eff0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1f000 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
1f010 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1f020 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1f030 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  f( pFile->sector
1f040 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Size == 0 ){.   
1f050 20 73 74 72 75 63 74 20 73 74 61 74 76 66 73 20   struct statvfs 
1f060 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a  fsInfo;.       .
1f070 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75      /* Set defau
1f080 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70  lts for non-supp
1f090 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d  orted filesystem
1f0a0 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  s */.    pFile->
1f0b0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
1f0c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
1f0d0 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46 69  OR_SIZE;.    pFi
1f0e0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1f0f0 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  teristics = 0;. 
1f100 20 20 20 69 66 28 20 66 73 74 61 74 76 66 73 28     if( fstatvfs(
1f110 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66  pFile->h, &fsInf
1f120 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20  o) == -1 ) {.   
1f130 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d     return pFile-
1f140 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
1f150 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 73 74 72   }..    if( !str
1f160 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  cmp(fsInfo.f_bas
1f170 65 74 79 70 65 2c 20 22 74 6d 70 22 29 20 29 20  etype, "tmp") ) 
1f180 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1f190 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1f1a0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1f1b0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f1c0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f1d0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1f1e0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c  IOCAP_ATOMIC4K |
1f1f0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61         /* All ra
1f200 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69  m filesystem wri
1f210 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
1f220 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1f230 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1f240 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
1f250 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
1f260 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
1f270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
1f2a0 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
1f2b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1f2c0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
1f2d0 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
1f2e0 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
1f2f0 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
1f330 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
1f340 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
1f350 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49  e if( strstr(fsI
1f360 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
1f370 22 65 74 66 73 22 29 20 29 7b 0a 20 20 20 20 20  "etfs") ){.     
1f380 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1f390 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
1f3a0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
1f3b0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1f3c0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1f3d0 20 20 2f 2a 20 65 74 66 73 20 63 6c 75 73 74 65    /* etfs cluste
1f3e0 72 20 73 69 7a 65 20 77 72 69 74 65 73 20 61 72  r size writes ar
1f3f0 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
1f400 20 20 20 20 28 70 46 69 6c 65 2d 3e 73 65 63 74      (pFile->sect
1f410 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53  orSize / 512 * S
1f420 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1f430 49 43 35 31 32 29 20 7c 0a 20 20 20 20 20 20 20  IC512) |.       
1f440 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
1f450 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
1f460 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
1f470 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
1f480 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1f4b0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
1f4c0 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
1f4d0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1f4e0 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1f4f0 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1f500 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1f510 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f530 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f540 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1f550 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1f560 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74     }else if( !st
1f570 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rcmp(fsInfo.f_ba
1f580 73 65 74 79 70 65 2c 20 22 71 6e 78 36 22 29 20  setype, "qnx6") 
1f590 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1f5a0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
1f5b0 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
1f5c0 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1f5d0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1f5e0 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  =.        SQLITE
1f5f0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20  _IOCAP_ATOMIC | 
1f600 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66          /* All f
1f610 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73  ilesystem writes
1f620 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
1f630 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1f640 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
1f650 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
1f660 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
1f670 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6a0 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
1f6b0 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
1f6c0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1f6d0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1f6e0 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1f6f0 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1f700 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1f740 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1f750 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
1f760 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1f770 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71  o.f_basetype, "q
1f780 6e 78 34 22 29 20 29 7b 0a 20 20 20 20 20 20 70  nx4") ){.      p
1f790 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f7a0 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1f7b0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1f7c0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1f7d0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1f7e0 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f  /* full bitset o
1f7f0 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d  f atomics from m
1f800 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61  ax sector size a
1f810 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  nd smaller */.  
1f820 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73        ((pFile->s
1f830 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
1f840 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
1f850 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20  TOMIC512) << 1) 
1f860 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51  - 2 |.        SQ
1f870 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1f880 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
1f890 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
1f8a0 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
1f8b0 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1f8e0 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
1f8f0 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1f900 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73    }else if( strs
1f910 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  tr(fsInfo.f_base
1f920 74 79 70 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a  type, "dos") ){.
1f930 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1f940 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1f950 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1f960 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1f970 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1f980 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
1f990 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
1f9a0 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
1f9b0 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
1f9c0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
1f9d0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f9e0 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
1f9f0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
1fa00 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
1fa10 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1fa20 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1fa30 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1fa40 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1fa50 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1fa90 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1faa0 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    0;.    }else{.
1fab0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
1fac0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1fad0 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
1fae0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1faf0 35 31 32 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c  512 |      /* bl
1fb00 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ocks are atomic 
1fb10 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1fb20 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1fb30 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
1fb40 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
1fb50 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
1fb60 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
1fb90 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
1fba0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1fbb0 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20  }.  }.  /* Last 
1fbc0 63 68 61 6e 63 65 20 76 65 72 69 66 69 63 61 74  chance verificat
1fbd0 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
1fbe0 74 6f 72 20 73 69 7a 65 20 69 73 6e 27 74 20 61  tor size isn't a
1fbf0 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35 31 32   multiple of 512
1fc00 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  .  ** then it is
1fc10 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69  n't valid.*/.  i
1fc20 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  f( pFile->sector
1fc30 53 69 7a 65 20 25 20 35 31 32 20 21 3d 20 30 20  Size % 512 != 0 
1fc40 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  ){.    pFile->de
1fc50 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1fc60 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ics = 0;.    pFi
1fc70 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1fc80 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1fc90 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
1fca0 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
1fcb0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23  >sectorSize;.}.#
1fcc0 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54  endif /* __QNXNT
1fcd0 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  O__ */../*.** Re
1fce0 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20  turn the device 
1fcf0 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1fd00 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  for the file..**
1fd10 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69 73 20  .** This VFS is 
1fd20 73 65 74 20 75 70 20 74 6f 20 72 65 74 75 72 6e  set up to return
1fd30 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1fd40 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1fd50 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a  E by default..**
1fd60 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 63   However, that c
1fd70 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72 6f 76  hoice is controv
1fd80 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74 65 63  ersial since tec
1fd90 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75 6e 64  hnically the und
1fda0 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20  erlying.** file 
1fdb0 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20  system does not 
1fdc0 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65 20 70  always provide p
1fdd0 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77 72 69  owersafe overwri
1fde0 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a  tes.  (In other.
1fdf0 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65 72 20  ** words, after 
1fe00 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65  a power-loss eve
1fe10 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74 68 65  nt, parts of the
1fe20 20 66 69 6c 65 20 74 68 61 74 20 77 65 72 65 20   file that were 
1fe30 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e  never.** written
1fe40 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
1fe50 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20 20 48  ing altered.)  H
1fe60 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57  owever, non-PSOW
1fe70 20 62 65 68 61 76 69 6f 72 20 69 73 20 76 65 72   behavior is ver
1fe80 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72 65 2e  y,.** very rare.
1fe90 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e 67 20    And asserting 
1fea0 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61 72  PSOW makes a lar
1feb0 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20  ge reduction in 
1fec0 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  the amount.** of
1fed0 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66 6f   required I/O fo
1fee0 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69  r journaling, si
1fef0 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61 64  nce a lot of pad
1ff00 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61 74  ding is eliminat
1ff10 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77  ed..**  Hence, w
1ff20 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f 4f  hile POWERSAFE_O
1ff30 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20 62  VERWRITE is on b
1ff40 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65  y default, there
1ff50 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72   is a file-contr
1ff60 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ol.** available 
1ff70 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20 61  to turn it off a
1ff80 6e 64 20 55 52 49 20 71 75 65 72 79 20 70 61 72  nd URI query par
1ff90 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c 65  ameter available
1ffa0 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 2e   to turn it off.
1ffb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1ffc0 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
1ffd0 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
1ffe0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
1fff0 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
20000 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
20010 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20   rc = 0;.#ifdef 
20020 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66 28  __QNXNTO__.  if(
20030 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d   p->sectorSize==
20040 30 20 29 20 75 6e 69 78 53 65 63 74 6f 72 53 69  0 ) unixSectorSi
20050 7a 65 28 69 64 29 3b 0a 20 20 72 63 20 3d 20 70  ze(id);.  rc = p
20060 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
20070 72 69 73 74 69 63 73 3b 0a 23 65 6e 64 69 66 0a  ristics;.#endif.
20080 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c 61    if( p->ctrlFla
20090 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50 53  gs & UNIXFILE_PS
200a0 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 7c 3d 20  OW ){.    rc |= 
200b0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
200c0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
200d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
200e0 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  c;.}..#if !defin
200f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
20100 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
20110 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 0a 2f  X_MMAP_SIZE>0../
20120 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20130 73 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65  system page size
20140 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
20150 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74  ction should not
20160 20 62 65 20 63 61 6c 6c 65 64 20 64 69 72 65 63   be called direc
20170 74 6c 79 20 62 79 20 6f 74 68 65 72 20 63 6f 64  tly by other cod
20180 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20  e in this file. 
20190 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20  .** Instead, it 
201a0 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
201b0 20 76 69 61 20 6d 61 63 72 6f 20 6f 73 47 65 74   via macro osGet
201c0 70 61 67 65 73 69 7a 65 28 29 2e 0a 2a 2f 0a 73  pagesize()..*/.s
201d0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
201e0 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29 7b  tpagesize(void){
201f0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
20200 20 20 72 65 74 75 72 6e 20 31 30 32 34 3b 0a 23    return 1024;.#
20210 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 42 53  elif defined(_BS
20220 44 5f 53 4f 55 52 43 45 29 0a 20 20 72 65 74 75  D_SOURCE).  retu
20230 72 6e 20 67 65 74 70 61 67 65 73 69 7a 65 28 29  rn getpagesize()
20240 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
20250 20 28 69 6e 74 29 73 79 73 63 6f 6e 66 28 5f 53   (int)sysconf(_S
20260 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a 23 65 6e  C_PAGESIZE);.#en
20270 64 69 66 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  dif.}..#endif /*
20280 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
20290 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
202a0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
202b0 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ZE>0 */..#ifndef
202c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
202d0 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
202e0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
202f0 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   an shared memor
20300 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a  y buffer.  .**.*
20310 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  * When multiple 
20320 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65  threads all refe
20330 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77  rence the same w
20340 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74  al-index, each t
20350 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73  hread.** has its
20360 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a   own unixShm obj
20370 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
20380 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  l point to a sin
20390 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20  gle instance.** 
203a0 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  of this unixShmN
203b0 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20  ode object.  In 
203c0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63  other words, eac
203d0 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f  h wal-index is o
203e0 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e  pened.** only on
203f0 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a  ce per process..
20400 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53  **.** Each unixS
20410 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
20420 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20   connected to a 
20430 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65  single unixInode
20440 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20  Info object..** 
20450 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63  We could coalesc
20460 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e  e this object in
20470 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  to unixInodeInfo
20480 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64  , but that would
20490 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f   mean.** every o
204a0 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f  pen file that do
204b0 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65  es not use share
204c0 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68  d memory (in oth
204d0 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a  er words, most.*
204e0 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f  * open files) wo
204f0 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72 72  uld have to carr
20500 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78  y around this ex
20510 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  tra information.
20520 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78    So.** the unix
20530 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
20540 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
20550 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78  ter to this unix
20560 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a  ShmNode object.*
20570 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68  * and the unixSh
20580 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
20590 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65  created only whe
205a0 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  n needed..**.** 
205b0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
205c0 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65  must be true whe
205d0 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65  n creating or de
205e0 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73  stroying.** this
205f0 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65   object or while
20600 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
20610 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
20620 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  g fields:.**.** 
20630 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20       nRef.**.** 
20640 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
20650 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e  elds are read-on
20660 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  ly after the obj
20670 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a  ect is created:.
20680 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a  ** .**      fid.
20690 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  **      zFilenam
206a0 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75  e.**.** Either u
206b0 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78  nixShmNode.mutex
206c0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72   must be held or
206d0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
206e0 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78  f==0 and.** unix
206f0 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74  MutexHeld() is t
20700 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67  rue when reading
20710 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20   or writing any 
20720 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69  other field.** i
20730 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
20740 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
20750 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78  ShmNode {.  unix
20760 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
20770 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e  e;     /* unixIn
20780 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e  odeInfo that own
20790 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20  s this SHM node 
207a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
207b0 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20  ex *mutex;      
207c0 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65  /* Mutex to acce
207d0 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  ss this object *
207e0 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
207f0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
20800 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d  * Name of the mm
20810 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
20820 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
20830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
20840 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
20850 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  or */.  int szRe
20860 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
20870 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68     /* Size of sh
20880 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
20890 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65  ons */.  u16 nRe
208a0 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
208b0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
208c0 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f  rray apRegion */
208d0 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79  .  u8 isReadonly
208e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
208f0 20 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e   True if read-on
20900 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ly */.  char **a
20910 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  pRegion;        
20920 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d     /* Array of m
20930 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  apped shared-mem
20940 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
20950 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
20960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20970 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d  umber of unixShm
20980 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
20990 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75  g to this */.  u
209a0 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  nixShm *pFirst; 
209b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
209c0 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
209d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
209e0 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
209f0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78  TE_DEBUG.  u8 ex
20a00 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
20a10 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
20a20 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
20a30 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68   held */.  u8 sh
20a40 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
20a50 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
20a60 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
20a70 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53  ld */.  u8 nextS
20a80 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
20a90 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
20aa0 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20  able unixShm.id 
20ab0 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  value */.#endif.
20ac0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  };../*.** Struct
20ad0 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  ure used interna
20ae0 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20  lly by this VFS 
20af0 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74  to record the st
20b00 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65  ate of an.** ope
20b10 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
20b20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
20b30 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
20b40 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69  fields are initi
20b50 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
20b60 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
20b70 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65  ed and.** are re
20b80 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74  ad-only thereaft
20b90 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69  er:.**.**    uni
20ba0 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20  xShm.pFile.**   
20bb0 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a   unixShm.id.**.*
20bc0 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c  * All other fiel
20bd0 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  ds are read/writ
20be0 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e  e.  The unixShm.
20bf0 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73  pFile->mutex mus
20c00 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69  t be held.** whi
20c10 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79  le accessing any
20c20 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c   read/write fiel
20c30 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  ds..*/.struct un
20c40 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68  ixShm {.  unixSh
20c50 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
20c60 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
20c70 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f  rlying unixShmNo
20c80 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  de object */.  u
20c90 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20  nixShm *pNext;  
20ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
20cb0 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74  t unixShm with t
20cc0 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e  he same unixShmN
20cd0 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d  ode */.  u8 hasM
20ce0 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
20cf0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
20d00 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53  olding the unixS
20d10 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
20d20 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20    u8 id;        
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20d40 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  Id of this conne
20d50 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73  ction within its
20d60 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
20d70 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
20d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
20d90 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
20da0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
20db0 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
20dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
20dd0 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
20de0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a  ocks held */.};.
20df0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
20e00 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
20e10 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  g.*/.#define UNI
20e20 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  X_SHM_BASE   ((2
20e30 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
20e40 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f  CK)*4)         /
20e50 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
20e60 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  e */.#define UNI
20e70 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e  X_SHM_DMS    (UN
20e80 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IX_SHM_BASE+SQLI
20e90 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
20ea0 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
20eb0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
20ec0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
20ed0 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79  locks for all by
20ee0 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68  tes from ofst th
20ef0 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a  rough ofst+n-1..
20f00 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63  **.** Locks bloc
20f10 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73  k if the mask is
20f20 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48   exactly UNIX_SH
20f30 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d  M_C and are non-
20f40 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65  blocking.** othe
20f50 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
20f60 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74   int unixShmSyst
20f70 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 46 69  emLock(.  unixFi
20f80 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
20f90 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74   /* Open connect
20fa0 69 6f 6e 20 74 6f 20 74 68 65 20 57 41 4c 20 66  ion to the WAL f
20fb0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ile */.  int loc
20fc0 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  kType,          
20fd0 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44  /* F_UNLCK, F_RD
20fe0 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20  LCK, or F_WRLCK 
20ff0 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
21000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21010 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
21020 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a   locking range *
21030 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20  /.  int n       
21040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21050 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
21060 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e   lock */.){.  un
21070 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
21080 6f 64 65 3b 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ode; /* Apply lo
21090 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
210a0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
210b0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 74 72 75  egment */.  stru
210c0 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20  ct flock f;     
210d0 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20     /* The posix 
210e0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67  advisory locking
210f0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
21100 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21110 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c 74  OK;    /* Result
21120 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c   code form fcntl
21130 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
21140 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68  ss to the unixSh
21150 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
21160 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
21170 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 70 53  e caller */.  pS
21180 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  hmNode = pFile->
21190 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
211a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
211b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
211c0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20  ShmNode->mutex) 
211d0 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
211e0 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68  f==0 );..  /* Sh
211f0 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72  ared locks never
21200 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20   span more than 
21210 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73  one byte */.  as
21220 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f  sert( n==1 || lo
21230 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20  ckType!=F_RDLCK 
21240 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61  );..  /* Locks a
21250 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20  re within range 
21260 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  */.  assert( n>=
21270 31 20 26 26 20 6e 3c 3d 53 51 4c 49 54 45 5f 53  1 && n<=SQLITE_S
21280 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  HM_NLOCK );..  i
21290 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
212a0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  0 ){.    /* Init
212b0 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
212c0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
212d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  .    memset(&f, 
212e0 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
212f0 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f     f.l_type = lo
21300 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f  ckType;.    f.l_
21310 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
21320 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74  T;.    f.l_start
21330 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c   = ofst;.    f.l
21340 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72  _len = n;..    r
21350 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d  c = osFcntl(pShm
21360 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  Node->h, F_SETLK
21370 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  , &f);.    rc = 
21380 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c  (rc!=(-1)) ? SQL
21390 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
213a0 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BUSY;.  }..  /* 
213b0 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61  Update the globa
213c0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64  l lock state and
213d0 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e   do debug tracin
213e0 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  g */.#ifdef SQLI
213f0 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36  TE_DEBUG.  { u16
21400 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45   mask;.  OSTRACE
21410 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b  (("SHM-LOCK "));
21420 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33  .  mask = ofst>3
21430 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28 31 3c  1 ? 0xffff : (1<
21440 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
21450 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63  <ofst);.  if( rc
21460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21470 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
21480 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
21490 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
214a0 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
214b0 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
214c0 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
214d0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
214e0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
214f0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
21500 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
21510 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
21520 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
21530 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  ad-lock %d ok", 
21540 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
21550 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
21560 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
21570 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
21580 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
21590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
215a0 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
215b0 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
215c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
215d0 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  te-lock %d ok", 
215e0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
215f0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
21600 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
21610 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
21620 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
21630 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
21640 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
21650 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
21660 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
21670 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
21680 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  st));.    }else 
21690 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
216a0 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
216b0 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
216c0 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  ck failed"));.  
216d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
216e0 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
216f0 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
21700 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
21710 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  e-lock %d failed
21720 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
21730 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
21740 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25  " - afterwards %
21750 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
21760 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
21770 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53  ->sharedMask, pS
21780 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
21790 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ));.  }.#endif..
217a0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20    return rc;    
217b0 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65      .}../*.** Re
217c0 74 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d  turn the minimum
217d0 20 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b 42 20   number of 32KB 
217e0 73 68 6d 20 72 65 67 69 6f 6e 73 20 74 68 61 74  shm regions that
217f0 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 70 70 65   should be mappe
21800 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20  d at.** a time, 
21810 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 65 61  assuming that ea
21820 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  ch mapping must 
21830 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  be an integer mu
21840 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a  ltiple of the.**
21850 20 63 75 72 72 65 6e 74 20 73 79 73 74 65 6d 20   current system 
21860 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page-size..**.**
21870 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
21880 73 20 31 2e 20 54 68 65 20 65 78 63 65 70 74 69  s 1. The excepti
21890 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62 65 20 73  on seems to be s
218a0 79 73 74 65 6d 73 20 74 68 61 74 20 61 72 65 20  ystems that are 
218b0 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f  configured.** to
218c0 20 75 73 65 20 36 34 4b 42 20 70 61 67 65 73 20   use 64KB pages 
218d0 2d 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 65  - in this case e
218e0 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  ach mapping must
218f0 20 63 6f 76 65 72 20 61 74 20 6c 65 61 73 74 20   cover at least 
21900 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f  two.** shm regio
21910 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
21920 74 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  t unixShmRegionP
21930 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20 69  erMap(void){.  i
21940 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30  nt shmsz = 32*10
21950 32 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  24;            /
21960 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a  * SHM region siz
21970 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
21980 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  = osGetpagesize(
21990 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 70  );   /* System p
219a0 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73  age size */.  as
219b0 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31 29 26  sert( ((pgsz-1)&
219c0 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a  pgsz)==0 );   /*
219d0 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   Page size must 
219e0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
219f0 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c 73 68  */.  if( pgsz<sh
21a00 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  msz ) return 1;.
21a10 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f 73 68    return pgsz/sh
21a20 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75  msz;.}../*.** Pu
21a30 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
21a40 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
21a50 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
21a60 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
21a70 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
21a80 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
21a90 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
21aa0 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
21ab0 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
21ac0 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
21ad0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
21ae0 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
21af0 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
21b00 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
21b10 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
21b20 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
21b30 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
21b40 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
21b50 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
21b60 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 52 65  && ALWAYS(p->nRe
21b70 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  f==0) ){.    int
21b80 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
21b90 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
21ba0 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p();.    int i;.
21bb0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
21bc0 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f  Inode==pFd->pIno
21bd0 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  de );.    sqlite
21be0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
21bf0 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28  mutex);.    for(
21c00 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
21c10 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70  n; i+=nShmPerMap
21c20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
21c30 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
21c40 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65  osMunmap(p->apRe
21c50 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65  gion[i], p->szRe
21c60 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gion);.      }el
21c70 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
21c80 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
21c90 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20  gion[i]);.      
21ca0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
21cb0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
21cc0 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  gion);.    if( p
21cd0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
21ce0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64  robust_close(pFd
21cf0 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  , p->h, __LINE__
21d00 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20  );.      p->h = 
21d10 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  -1;.    }.    p-
21d20 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
21d30 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
21d40 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
21d50 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
21d60 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
21d70 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
21d80 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  th open database
21d90 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a   file pDbFd.  .*
21da0 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
21db0 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
21dc0 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69   uses mmapped fi
21dd0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  les..**.** The f
21de0 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ile used to impl
21df0 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d  ement shared-mem
21e00 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61  ory is in the sa
21e10 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  me directory.** 
21e20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
21e30 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61  base file and ha
21e40 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
21e50 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
21e60 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74  base.** file wit
21e70 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66  h the "-shm" suf
21e80 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20  fix added.  For 
21e90 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
21ea0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
21eb0 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31   is "/home/user1
21ec0 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e  /config.db" then
21ed0 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69   the file that i
21ee0 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d  s created and mm
21ef0 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61  apped.** for sha
21f00 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
21f10 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65  be called "/home
21f20 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
21f30 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  -shm".  .**.** A
21f40 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20  nother approach 
21f50 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c  to is to use fil
21f60 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f  es in /dev/shm o
21f70 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e  r /dev/tmp or an
21f80 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74  .** some other t
21f90 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20  mpfs mount. But 
21fa0 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64  if a file in a d
21fb0 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f  ifferent directo
21fc0 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  ry.** from the d
21fd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
21fe0 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65  used, then diffe
21ff0 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d  ring access perm
22000 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20  issions.** or a 
22010 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63  chroot() might c
22020 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65  ause two differe
22030 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20  nt processes on 
22040 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61  the same.** data
22050 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75  base to end up u
22060 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66  sing different f
22070 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20  iles for shared 
22080 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61  memory - .** mea
22090 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20  ning that their 
220a0 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74  memory would not
220b0 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65   really be share
220c0 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  d - resulting.**
220d0 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72   in database cor
220e0 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74  ruption.  Nevert
220f0 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70  heless, this tmp
22100 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a  fs file usage.**
22110 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20   can be enabled 
22120 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
22130 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53  using -DSQLITE_S
22140 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64  HM_DIRECTORY="/d
22150 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68  ev/shm".** or th
22160 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54  e equivalent.  T
22170 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51  he use of the SQ
22180 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22190 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  RY compile-time.
221a0 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74  ** option result
221b0 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  s in an incompat
221c0 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51  ible build of SQ
221d0 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66  Lite;  builds of
221e0 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20   SQLite.** that 
221f0 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53  with differing S
22200 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
22210 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74  ORY settings att
22220 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a  empt to use the.
22230 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  ** same database
22240 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
22250 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65  e time, database
22260 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
22270 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
22280 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48  t. The SQLITE_SH
22290 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
222a0 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
222b0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a  is considered.**
222c0 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61   "unsupported" a
222d0 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69  nd may go away i
222e0 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74  n a future SQLit
222f0 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a  e release..**.**
22300 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
22310 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
22320 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
22330 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
22340 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
22350 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
22360 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
22370 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
22380 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
22390 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
223a0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
223b0 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
223c0 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
223d0 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eared..**.** If 
223e0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
223f0 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46  abase file (pDbF
22400 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20  d) is using the 
22410 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a  "unix-excl" VFS.
22420 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  ** that means th
22430 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  at an exclusive 
22440 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
22450 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22460 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f  e and.** that no
22470 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
22480 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61   are able to rea
22490 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64  d or write the d
224a0 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20  atabase.  In.** 
224b0 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f  that case, we do
224c0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64   not really need
224d0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
224e0 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   No shared memor
224f0 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65  y.** file is cre
22500 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65  ated.  The share
22510 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
22520 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20   simulated with 
22530 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  heap memory..*/.
22540 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
22550 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
22560 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29  unixFile *pDbFd)
22570 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  {.  struct unixS
22580 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  hm *p = 0;      
22590 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
225a0 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
225b0 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ed */.  struct u
225c0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
225d0 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75  Node;   /* The u
225e0 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
225f0 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
22600 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
22610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22620 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
22630 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
22640 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
22650 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20  /* The inode of 
22660 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  fd */.  char *zS
22670 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
22680 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
22690 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65 64  of the file used
226a0 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e   for SHM */.  in
226b0 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20  t nShmFilename; 
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
226d0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d   Size of the SHM
226e0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74   filename in byt
226f0 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  es */..  /* Allo
22700 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
22710 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f  he new unixShm o
22720 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20  bject. */.  p = 
22730 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
22740 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
22750 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
22760 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22770 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
22780 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
22790 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
227a0 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Shm==0 );..  /* 
227b0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
227c0 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  a unixShmNode ob
227d0 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69  ject already exi
227e0 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78  sts. Reuse an ex
227f0 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20  isting.  ** one 
22800 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61  if present. Crea
22810 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
22820 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
22830 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
22840 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
22850 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
22860 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64  pShmNode = pInod
22870 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e->pShmNode;.  i
22880 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
22890 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
228a0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
228b0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61           /* fsta
228c0 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74  t() info for dat
228d0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69  abase file */.#i
228e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  fndef SQLITE_SHM
228f0 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 63  _DIRECTORY.    c
22900 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
22910 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50  Path = pDbFd->zP
22920 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ath;.#endif..   
22930 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29   /* Call fstat()
22940 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74   to figure out t
22950 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
22960 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
22970 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ile. If.    ** a
22980 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20   new *-shm file 
22990 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61  is created, an a
229a0 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d  ttempt will be m
229b0 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69 74  ade to create it
229c0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
229d0 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
229e0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
229f0 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d  ( osFstat(pDbFd-
22a00 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
22a10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22a20 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
22a30 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
22a40 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69  n_err;.    }..#i
22a50 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
22a60 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53  DIRECTORY.    nS
22a70 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a  hmFilename = siz
22a80 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44  eof(SQLITE_SHM_D
22a90 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a  IRECTORY) + 31;.
22aa0 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69  #else.    nShmFi
22ab0 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e  lename = 6 + (in
22ac0 74 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50 61  t)strlen(zBasePa
22ad0 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  th);.#endif.    
22ae0 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74  pShmNode = sqlit
22af0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
22b00 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
22b10 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b   nShmFilename );
22b20 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
22b30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
22b40 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22b50 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
22b60 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
22b70 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e      memset(pShmN
22b80 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ode, 0, sizeof(*
22b90 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69  pShmNode)+nShmFi
22ba0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68  lename);.    zSh
22bb0 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d  mFilename = pShm
22bc0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  Node->zFilename 
22bd0 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f  = (char*)&pShmNo
22be0 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51  de[1];.#ifdef SQ
22bf0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22c00 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  RY.    sqlite3_s
22c10 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
22c20 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
22c30 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
22c40 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
22c50 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22  _SHM_DIRECTORY "
22c60 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25  /sqlite-shm-%x-%
22c70 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
22c80 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53           (u32)sS
22c90 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32  tat.st_ino, (u32
22ca0 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a  )sStat.st_dev);.
22cb0 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65  #else.    sqlite
22cc0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
22cd0 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c  ilename, zShmFil
22ce0 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
22cf0 20 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20   zBasePath);.   
22d00 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
22d10 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
22d20 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
22d30 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
22d40 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  Node->h = -1;.  
22d50 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d    pDbFd->pInode-
22d60 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
22d70 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  Node;.    pShmNo
22d80 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62  de->pInode = pDb
22d90 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  Fd->pInode;.    
22da0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
22db0 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
22dc0 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
22dd0 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
22de0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
22df0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
22e00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22e10 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
22e20 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
22e30 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
22e40 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
22e50 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
22e60 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
22e70 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20   | O_CREAT;.    
22e80 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
22e90 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d  i_boolean(pDbFd-
22ea0 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c  >zPath, "readonl
22eb0 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20  y_shm", 0) ){.  
22ec0 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
22ed0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
22ee0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
22ef0 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
22f00 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d      }.      pShm
22f10 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74  Node->h = robust
22f20 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61  _open(zShmFilena
22f30 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28  me, openFlags, (
22f40 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37  sStat.st_mode&07
22f50 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  77));.      if( 
22f60 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b  pShmNode->h<0 ){
22f70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
22f80 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
22f90 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
22fa0 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c   "open", zShmFil
22fb0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
22fc0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
22fd0 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
22fe0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f    /* If this pro
22ff0 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  cess is running 
23000 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75  as root, make su
23010 72 65 20 74 68 61 74 20 74 68 65 20 53 48 4d 20  re that the SHM 
23020 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  file.      ** is
23030 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73 61   owned by the sa
23040 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f 77 6e  me user that own
23050 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
23060 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72 77  atabase.  Otherw
23070 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ise,.      ** th
23080 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72  e original owner
23090 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
230a0 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20  e to connect..  
230b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62      */.      rob
230c0 75 73 74 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f  ustFchown(pShmNo
230d0 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f  de->h, sStat.st_
230e0 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69  uid, sStat.st_gi
230f0 64 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  d);.  .      /* 
23100 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23110 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
23120 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
23130 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
23140 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c        ** If not,
23150 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
23160 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
23170 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  h. .      */.   
23180 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23190 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  K;.      if( uni
231a0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
231b0 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55  DbFd, F_WRLCK, U
231c0 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  NIX_SHM_DMS, 1)=
231d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
231e0 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
231f0 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
23200 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20  ode->h, 0) ){.  
23210 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
23220 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
23230 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
23240 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68  "ftruncate", zSh
23250 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
23260 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
23270 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23290 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
232a0 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
232b0 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _RDLCK, UNIX_SHM
232c0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
232d0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
232e0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
232f0 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rr;.    }.  }.. 
23300 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
23310 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
23320 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53  ild of the unixS
23330 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
23340 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
23350 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  de;.#ifdef SQLIT
23360 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20  E_DEBUG.  p->id 
23370 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74  = pShmNode->next
23380 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ShmId++;.#endif.
23390 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
233a0 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  ++;.  pDbFd->pSh
233b0 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61  m = p;.  unixLea
233c0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
233d0 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
233e0 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
233f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
23400 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
23410 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
23420 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e  er of the unixEn
23430 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78  terMutex() mutex
23440 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72   and the pointer
23450 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e   from the.  ** n
23460 65 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53  ew (struct unixS
23470 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  hm) object to th
23480 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62  e pShmNode has b
23490 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61  een set. All tha
234a0 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74  t is.  ** left t
234b0 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20  o do is to link 
234c0 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
234d0 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
234e0 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ist starting.  *
234f0 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  * at pShmNode->p
23500 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74  First. This must
23510 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68   be done while h
23520 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e  olding the pShmN
23530 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a  ode->mutex .  **
23540 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   mutex..  */.  s
23550 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
23560 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
23570 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
23580 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
23590 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
235a0 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
235b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
235c0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
235d0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
235e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
235f0 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
23600 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
23610 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50  _err:.  unixShmP
23620 75 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20  urge(pDbFd);    
23630 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
23640 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69  frees pShmNode i
23650 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
23660 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
23670 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
23680 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
23690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
236a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
236b0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
236c0 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
236d0 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20   iRegion of the 
236e0 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
236f0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
23700 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
23710 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
23720 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a  emory regions .*
23730 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
23740 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
23750 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
23760 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
23770 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74  szRegion .** byt
23780 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
23790 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
237a0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
237b0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
237c0 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
237d0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
237e0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
237f0 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65  bExtend paramete
23800 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
23810 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
23820 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
23830 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
23840 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
23850 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
23860 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
23870 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
23880 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
23890 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
238a0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
238b0 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20  eturned. If .** 
238c0 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a  bExtend is non-z
238d0 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
238e0 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
238f0 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
23900 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20  ot yet .** been 
23910 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
23920 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
23930 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
23940 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
23950 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
23960 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
23970 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
23980 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
23990 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
239a0 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
239b0 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
239c0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
239d0 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  ses .** address 
239e0 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
239f0 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
23a00 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
23a10 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20  t to the mapped 
23a20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
23a30 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
23a40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
23a50 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73   unixShmMap(.  s
23a60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a80 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e  * Handle open on
23a90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
23aa0 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c  /.  int iRegion,
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ac0 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f      /* Region to
23ad0 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69   retrieve */.  i
23ae0 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20  nt szRegion,    
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23b00 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e  * Size of region
23b10 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65  s */.  int bExte
23b20 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
23b30 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
23b40 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66  o extend file if
23b50 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
23b60 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a  void volatile **
23b70 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pp              
23b80 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d  /* OUT: Mapped m
23b90 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e  emory */.){.  un
23ba0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
23bb0 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
23bc0 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75   unixShm *p;.  u
23bd0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
23be0 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
23bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
23c00 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75  t nShmPerMap = u
23c10 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
23c20 61 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71  ap();.  int nReq
23c30 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66  Region;..  /* If
23c40 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
23c50 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  ry file has not 
23c60 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
23c70 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
23c80 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53  .  if( pDbFd->pS
23c90 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  hm==0 ){.    rc 
23ca0 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  = unixOpenShared
23cb0 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
23cc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23cd0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
23ce0 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62  ;.  }..  p = pDb
23cf0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d  Fd->pShm;.  pShm
23d00 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
23d10 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
23d20 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
23d30 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
23d40 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
23d50 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
23d60 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
23d70 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  nRegion==0 );.  
23d80 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
23d90 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
23da0 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
23db0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
23dc0 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
23dd0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
23de0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
23df0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
23e00 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
23e10 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
23e20 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69  =0 );..  /* Mini
23e30 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
23e40 67 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74  gions required t
23e50 6f 20 62 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a  o be mapped. */.
23e60 20 20 6e 52 65 71 52 65 67 69 6f 6e 20 3d 20 28    nReqRegion = (
23e70 28 69 52 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72  (iRegion+nShmPer
23e80 4d 61 70 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61  Map) / nShmPerMa
23e90 70 29 20 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b  p) * nShmPerMap;
23ea0 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
23eb0 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65  ->nRegion<nReqRe
23ec0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
23ed0 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20   **apNew;       
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ef0 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d  * New apRegion[]
23f00 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
23f10 74 20 6e 42 79 74 65 20 3d 20 6e 52 65 71 52 65  t nByte = nReqRe
23f20 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  gion*szRegion;  
23f30 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
23f40 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
23f50 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
23f60 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
23f70 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
23f80 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a   by fstat() */..
23f90 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
23fa0 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
23fb0 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d  n;..    if( pShm
23fc0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
23fd0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
23fe0 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
23ff0 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
24000 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
24010 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
24020 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
24030 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
24040 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
24050 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
24060 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20  ex file is.     
24070 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
24080 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
24090 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
240a0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
240b0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53    if( osFstat(pS
240c0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
240d0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
240e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
240f0 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
24100 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24110 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
24120 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
24130 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
24140 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
24150 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
24160 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
24170 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
24180 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
24190 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
241a0 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
241b0 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
241c0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
241d0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
241e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
241f0 21 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20  !bExtend ){.    
24200 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
24210 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
24220 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  }..        /* Al
24230 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
24240 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
24250 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
24260 2e 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20  . Do this by.   
24270 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20       ** writing 
24280 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
24290 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
242a0 20 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67   (OS) page being
242b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
242c0 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
242d0 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  d. Technically, 
242e0 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69  we need only wri
242f0 74 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  te to the.      
24300 20 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69    ** last page i
24310 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e  n order to exten
24320 64 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20  d the file. But 
24330 77 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e  writing to all n
24340 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ew.        ** pa
24350 67 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f  ges forces the O
24360 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  S to allocate th
24370 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  em immediately, 
24380 77 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20  which reduces.  
24390 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61        ** the cha
243a0 6e 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77  nces of SIGBUS w
243b0 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74  hile accessing t
243c0 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
243d0 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20   later on..     
243e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c     */.        el
243f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
24400 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70  atic const int p
24410 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  gsz = 4096;.    
24420 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a        int iPg;..
24430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
24440 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62  te to the last b
24450 79 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c  yte of each newl
24460 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65  y allocated or e
24470 78 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a  xtended page */.
24480 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
24490 28 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29  ( (nByte % pgsz)
244a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
244b0 20 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e   for(iPg=(sStat.
244c0 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69  st_size/pgsz); i
244d0 50 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b  Pg<(nByte/pgsz);
244e0 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iPg++){.       
244f0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 30 3b 0a       int x = 0;.
24500 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24510 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 70  seekAndWriteFd(p
24520 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50 67 2a  ShmNode->h, iPg*
24530 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c 20 22  pgsz + pgsz-1, "
24540 22 2c 20 31 2c 20 26 78 29 21 3d 31 20 29 7b 0a  ", 1, &x)!=1 ){.
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
24560 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
24570 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
24580 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  ename;.         
24590 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
245a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
245b0 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77 72  ERR_SHMSIZE, "wr
245c0 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  ite", zFile);.  
245d0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
245e0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
245f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24610 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
24620 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
24630 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
24640 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
24650 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
24660 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
24670 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20    apNew = (char 
24680 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
24690 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
246a0 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20  Node->apRegion, 
246b0 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65 6f  nReqRegion*sizeo
246c0 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
246d0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
246e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
246f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
24700 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
24710 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
24720 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
24730 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
24740 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
24750 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65  ode->nRegion<nRe
24760 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20  qRegion ){.     
24770 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65   int nMap = szRe
24780 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b  gion*nShmPerMap;
24790 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
247a0 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a      void *pMem;.
247b0 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
247c0 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
247d0 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61      pMem = osMma
247e0 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20  p(0, nMap,.     
247f0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
24800 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52  >isReadonly ? PR
24810 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52  OT_READ : PROT_R
24820 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20  EAD|PROT_WRITE, 
24830 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50  .            MAP
24840 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64  _SHARED, pShmNod
24850 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28  e->h, szRegion*(
24860 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  i64)pShmNode->nR
24870 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b  egion.        );
24880 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
24890 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  m==MAP_FAILED ){
248a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
248b0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
248c0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
248d0 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f  , "mmap", pShmNo
248e0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
248f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
24900 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
24910 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
24920 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  e{.        pMem 
24930 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
24940 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  64(szRegion);.  
24950 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
24960 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
24970 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
24980 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
24990 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
249a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
249b0 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20  memset(pMem, 0, 
249c0 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
249d0 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   }..      for(i=
249e0 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b  0; i<nShmPerMap;
249f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
24a00 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
24a10 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
24a20 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61 72  ion+i] = &((char
24a30 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e  *)pMem)[szRegion
24a40 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  *i];.      }.   
24a50 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
24a60 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d  gion += nShmPerM
24a70 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73  ap;.    }.  }..s
24a80 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  hmpage_out:.  if
24a90 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
24aa0 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20  ion>iRegion ){. 
24ab0 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64     *pp = pShmNod
24ac0 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67  e->apRegion[iReg
24ad0 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ion];.  }else{. 
24ae0 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a     *pp = 0;.  }.
24af0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
24b00 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63  isReadonly && rc
24b10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
24b20 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
24b30 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  LY;.  sqlite3_mu
24b40 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
24b50 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
24b60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24b70 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63  * Change the loc
24b80 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68  k state for a sh
24b90 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
24ba0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ent..**.** Note 
24bb0 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f  that the relatio
24bc0 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48  nship between SH
24bd0 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49  AREd and EXCLUSI
24be0 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69  VE locks is a li
24bf0 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e  ttle.** differen
24c00 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70  t here than in p
24c10 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f  osix.  In xShmLo
24c20 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f  ck(), one can go
24c30 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a   from unlocked.*
24c40 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20  * to shared and 
24c50 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c  back or from unl
24c60 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69  ocked to exclusi
24c70 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75  ve and back.  Bu
24c80 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74  t one may.** not
24c90 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20   go from shared 
24ca0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20  to exclusive or 
24cb0 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74  from exclusive t
24cc0 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61  o shared..*/.sta
24cd0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c  tic int unixShmL
24ce0 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
24cf0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
24d00 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
24d10 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
24d20 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
24d30 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24d50 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
24d60 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
24d70 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
24da0 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
24db0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
24dc0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
24dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
24de0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
24df0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e   lock */.){.  un
24e00 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
24e10 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20  (unixFile*)fd;  
24e20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
24e30 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
24e40 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69   memory */.  uni
24e50 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  xShm *p = pDbFd-
24e60 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
24e70 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
24e80 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
24e90 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68  cked */.  unixSh
24ea0 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
24eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ec0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
24ed0 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
24ee0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
24ef0 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
24f00 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54  >pShmNode;  /* T
24f10 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69  he underlying fi
24f20 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  le iNode */.  in
24f30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24f50 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
24f60 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b  de */.  u16 mask
24f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24f90 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74   Mask of locks t
24fa0 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73  o take or releas
24fb0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
24fc0 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d  pShmNode==pDbFd-
24fd0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
24fe0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
24ff0 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
25000 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
25010 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ;.  assert( ofst
25020 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
25030 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
25040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
25050 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
25060 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
25070 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
25080 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
25090 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
250a0 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
250b0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
250c0 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
250d0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
250e0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
250f0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
25100 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
25110 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
25120 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
25130 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
25140 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
25150 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
25160 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
25170 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
25180 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c  ShmNode->h>=0 ||
25190 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
251a0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20  bProcessLock==1 
251b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
251c0 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44  mNode->h<0 || pD
251d0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
251e0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
251f0 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f  .  mask = (1<<(o
25200 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
25210 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  st);.  assert( n
25220 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
25230 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
25240 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
25250 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
25260 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
25270 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
25280 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
25290 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
252a0 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
252b0 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
252c0 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
252d0 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
252e0 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
252f0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
25300 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
25310 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
25320 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
25330 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25340 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
25350 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
25360 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
25370 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
25380 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
25390 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
253a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
253b0 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
253c0 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
253d0 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
253e0 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
253f0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
25400 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
25410 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_UNLCK, ofst+U
25420 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
25430 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25440 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
25450 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
25460 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
25470 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
25480 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25490 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
254a0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
254b0 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
254c0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
254d0 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
254e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
254f0 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
25500 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
25510 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
25520 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
25530 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
25540 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
25550 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
25560 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
25570 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
25580 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
25590 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
255a0 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
255b0 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
255c0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
255d0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
255e0 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
255f0 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
25600 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
25610 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
25620 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
25630 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
25640 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
25650 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
25660 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
25670 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
25680 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
25690 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
256a0 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
256b0 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
256c0 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
256d0 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
256e0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
256f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25700 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
25710 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
25720 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
25730 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
25740 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
25750 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _RDLCK, ofst+UNI
25760 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
25770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25780 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25790 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
257a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
257b0 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
257c0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
257d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
257e0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
257f0 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
25800 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
25810 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
25820 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
25830 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
25840 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
25850 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
25860 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
25870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
25880 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
25890 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
258a0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
258b0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
258c0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
258d0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
258e0 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
258f0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
25900 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
25910 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
25920 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
25930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25940 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68    .    /* Get th
25950 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
25960 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
25970 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
25980 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
25990 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
259a0 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
259b0 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
259c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
259d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
259e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
259f0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
25a00 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f  DbFd, F_WRLCK, o
25a10 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
25a20 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  E, n);.      if(
25a30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25a40 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
25a50 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ( (p->sharedMask
25a60 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20   & mask)==0 );. 
25a70 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61         p->exclMa
25a80 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
25a90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
25aa0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
25ab0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
25ac0 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
25ad0 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
25ae0 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20  -%d, pid-%d got 
25af0 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
25b00 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
25b10 6f 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d 3e  osGetpid(0), p->
25b20 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
25b30 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74  xclMask));.  ret
25b40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25b50 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
25b60 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
25b70 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
25b80 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
25b90 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
25ba0 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
25bb0 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
25bc0 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
25bd0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
25be0 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
25bf0 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
25c00 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
25c10 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72   void unixShmBar
25c20 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rier(.  sqlite3_
25c30 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20  file *fd        
25c40 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
25c50 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
25c60 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
25c70 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
25c80 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
25c90 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79  .  sqlite3Memory
25ca0 42 61 72 72 69 65 72 28 29 3b 20 20 20 20 20 20  Barrier();      
25cb0 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64     /* compiler-d
25cc0 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61  efined memory ba
25cd0 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e 69 78 45  rrier */.  unixE
25ce0 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20  nterMutex();    
25cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
25d00 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72 65  so mutex, for re
25d10 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75 6e  dundancy */.  un
25d20 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
25d30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
25d40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
25d50 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
25d60 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
25d70 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
25d80 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
25d90 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
25da0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61   there is no sha
25db0 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
25dc0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63  iated with the c
25dd0 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74  onnection then t
25de0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
25df0 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
25e00 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
25e10 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a  t unixShmUnmap(.
25e20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
25e30 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
25e40 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
25e50 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
25e60 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  e */.  int delet
25e70 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
25e80 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
25e90 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
25ea0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  f true */.){.  u
25eb0 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  nixShm *p;      
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25ed0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
25ee0 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
25ef0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
25f00 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
25f10 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
25f20 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
25f30 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ry file */.  uni
25f40 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  xShm **pp;      
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f60 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
25f70 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
25f80 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69  ions */.  unixFi
25f90 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
25fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25fb0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
25fc0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
25fd0 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
25fe0 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
25ff0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
26000 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
26010 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
26020 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
26030 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  e;..  assert( pS
26040 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
26050 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
26060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
26070 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
26080 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
26090 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
260a0 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
260b0 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
260c0 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
260d0 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e  .  ** with pShmN
260e0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
260f0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
26100 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
26110 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64   for(pp=&pShmNod
26120 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29  e->pFirst; (*pp)
26130 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  !=p; pp = &(*pp)
26140 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70  ->pNext){}.  *pp
26150 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
26160 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e  /* Free the conn
26170 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71  ection p */.  sq
26180 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
26190 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30   pDbFd->pShm = 0
261a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
261b0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
261c0 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
261d0 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  If pShmNode->nRe
261e0 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c  f has reached 0,
261f0 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
26200 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20  underlying.  ** 
26210 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
26220 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69  le, too */.  uni
26230 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
26240 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
26250 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  e->nRef>0 );.  p
26260 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b  ShmNode->nRef--;
26270 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
26280 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
26290 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26  if( deleteFlag &
262a0 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  & pShmNode->h>=0
262b0 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
262c0 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  nk(pShmNode->zFi
262d0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  lename);.    }. 
262e0 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28     unixShmPurge(
262f0 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  pDbFd);.  }.  un
26300 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
26310 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26320 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23  _OK;.}...#else.#
26330 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d   define unixShmM
26340 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
26350 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20  e unixShmLock   
26360 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
26370 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
26380 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d  efine unixShmUnm
26390 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
263a0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
263b0 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66  OMIT_WAL */..#if
263c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
263d0 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66  _SIZE>0./*.** If
263e0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
263f0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20   memory mapped, 
26400 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e 0a  unmap file pFd..
26410 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
26420 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69  nixUnmapfile(uni
26430 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61  xFile *pFd){.  a
26440 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
26450 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66  chOut==0 );.  if
26460 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
26470 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61  n ){.    osMunma
26480 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  p(pFd->pMapRegio
26490 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  n, pFd->mmapSize
264a0 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64  Actual);.    pFd
264b0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
264c0 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ;.    pFd->mmapS
264d0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64  ize = 0;.    pFd
264e0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
264f0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
26500 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
26510 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
26520 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
26530 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 66   maintained by f
26540 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74  ile .** descript
26550 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20 62  or pFd to nNew b
26560 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74 69  ytes. Any existi
26570 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64 69  ng mapping is di
26580 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  scarded..**.** I
26590 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
265a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
265b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
265c0 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ariables:.**.** 
265d0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 70        unixFile.p
265e0 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20  MapRegion.**    
265f0 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70     unixFile.mmap
26600 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e  Size.**       un
26610 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41  ixFile.mmapSizeA
26620 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75  ctual.**.** If u
26630 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20  nsuccessful, an 
26640 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
26650 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69   logged via sqli
26660 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a  te3_log() and.**
26670 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69 61   the three varia
26680 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a  bles above are z
26690 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63  eroed. In this c
266a0 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c  ase SQLite shoul
266b0 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63  d.** continue ac
266c0 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61  cessing the data
266d0 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 78  base using the x
266e0 52 65 61 64 28 29 20 61 6e 64 20 78 57 72 69 74  Read() and xWrit
266f0 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a  e().** methods..
26700 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
26710 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20  nixRemapfile(.  
26720 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20  unixFile *pFd,  
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26740 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
26750 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  or object */.  i
26760 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20  64 nNew         
26770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26780 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70 70 69  * Required mappi
26790 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20  ng size */.){.  
267a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
267b0 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74   = "mmap";.  int
267c0 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20   h = pFd->h;    
267d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267e0 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
267f0 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20  ptor open on db 
26800 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f  file */.  u8 *pO
26810 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d  rig = (u8 *)pFd-
26820 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f  >pMapRegion;   /
26830 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
26840 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e  rent file mappin
26850 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67  g */.  i64 nOrig
26860 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
26870 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53  Actual;     /* S
26880 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67  ize of pOrig reg
26890 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ion in bytes */.
268a0 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20    u8 *pNew = 0; 
268b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69         /* Locati
268d0 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e  on of new mappin
268e0 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  g */.  int flags
268f0 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20   = PROT_READ;   
26900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26910 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
26920 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73  mmap() */..  ass
26930 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
26940 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Out==0 );.  asse
26950 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d  rt( nNew>pFd->mm
26960 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  apSize );.  asse
26970 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d  rt( nNew<=pFd->m
26980 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20  mapSizeMax );.  
26990 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29  assert( nNew>0 )
269a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ;.  assert( pFd-
269b0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3e  >mmapSizeActual>
269c0 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
269d0 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50 5f  ;.  assert( MAP_
269e0 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69  FAILED!=0 );..#i
269f0 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50  fdef SQLITE_MMAP
26a00 5f 52 45 41 44 57 52 49 54 45 0a 20 20 69 66 28  _READWRITE.  if(
26a10 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73   (pFd->ctrlFlags
26a20 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e   & UNIXFILE_RDON
26a30 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c  LY)==0 ) flags |
26a40 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65  = PROT_WRITE;.#e
26a50 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 72 69  ndif..  if( pOri
26a60 67 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52  g ){.#if HAVE_MR
26a70 45 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65  EMAP.    i64 nRe
26a80 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  use = pFd->mmapS
26a90 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63  ize;.#else.    c
26aa0 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61  onst int szSyspa
26ab0 67 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69  ge = osGetpagesi
26ac0 7a 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52  ze();.    i64 nR
26ad0 65 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61  euse = (pFd->mma
26ae0 70 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70  pSize & ~(szSysp
26af0 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  age-1));.#endif.
26b00 20 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26      u8 *pReq = &
26b10 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a  pOrig[nReuse];..
26b20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79      /* Unmap any
26b30 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 65 78   pages of the ex
26b40 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74  isting mapping t
26b50 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  hat cannot be re
26b60 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  used. */.    if(
26b70 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29   nReuse!=nOrig )
26b80 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70  {.      osMunmap
26b90 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65  (pReq, nOrig-nRe
26ba0 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  use);.    }..#if
26bb0 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20   HAVE_MREMAP.   
26bc0 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70   pNew = osMremap
26bd0 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20  (pOrig, nReuse, 
26be0 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59  nNew, MREMAP_MAY
26bf0 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20  MOVE);.    zErr 
26c00 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73  = "mremap";.#els
26c10 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  e.    pNew = osM
26c20 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e  map(pReq, nNew-n
26c30 52 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41  Reuse, flags, MA
26c40 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65  P_SHARED, h, nRe
26c50 75 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  use);.    if( pN
26c60 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew!=MAP_FAILED )
26c70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  {.      if( pNew
26c80 21 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20  !=pReq ){.      
26c90 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c    osMunmap(pNew,
26ca0 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b   nNew - nReuse);
26cb0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
26cc0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
26cd0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70          pNew = p
26ce0 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Orig;.      }.  
26cf0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
26d00 2f 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20 74  /* The attempt t
26d10 6f 20 65 78 74 65 6e 64 20 74 68 65 20 65 78 69  o extend the exi
26d20 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61  sting mapping fa
26d30 69 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a  iled. Free it. *
26d40 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  /.    if( pNew==
26d50 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e  MAP_FAILED || pN
26d60 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  ew==0 ){.      o
26d70 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e  sMunmap(pOrig, n
26d80 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Reuse);.    }.  
26d90 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20  }..  /* If pNew 
26da0 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74  is still NULL, t
26db0 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ry to create an 
26dc0 65 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70  entirely new map
26dd0 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ping. */.  if( p
26de0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  New==0 ){.    pN
26df0 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e  ew = osMmap(0, n
26e00 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f  New, flags, MAP_
26e10 53 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20  SHARED, h, 0);. 
26e20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   }..  if( pNew==
26e30 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
26e40 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
26e50 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e  nNew = 0;.    un
26e60 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
26e70 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d  E_OK, zErr, pFd-
26e80 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a  >zPath);..    /*
26e90 20 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61   If the mmap() a
26ea0 62 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73  bove failed, ass
26eb0 75 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62  ume that all sub
26ec0 73 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63  sequent mmap() c
26ed0 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  alls.    ** will
26ee0 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74   probably fail t
26ef0 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f  oo. Fall back to
26f00 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72   using xRead/xWr
26f10 69 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a  ite exclusively.
26f20 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63      ** in this c
26f30 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64  ase.  */.    pFd
26f40 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
26f50 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d  0;.  }.  pFd->pM
26f60 61 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64  apRegion = (void
26f70 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e   *)pNew;.  pFd->
26f80 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e  mmapSize = pFd->
26f90 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
26fa0 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nNew;.}../*.** 
26fb0 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65  Memory map or re
26fc0 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65  map the file ope
26fd0 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63  ned by file-desc
26fe0 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74  riptor pFd (if t
26ff0 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c  he file.** is al
27000 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68  ready mapped, th
27010 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
27020 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  ng is replaced b
27030 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20  y the new). Or, 
27040 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72  if .** there alr
27050 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61  eady exists a ma
27060 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66  pping for this f
27070 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ile, and there a
27080 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74  re still .** out
27090 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28  standing xFetch(
270a0 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  ) references to 
270b0 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  it, this functio
270c0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
270d0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
270e0 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65   nByte is non-ne
270f0 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20  gative, then it 
27100 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  is the requested
27110 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65   size of .** the
27120 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61   mapping to crea
27130 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  te. Otherwise, i
27140 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20  f nByte is less 
27150 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
27160 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
27170 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69  d size is the si
27180 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
27190 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75  n disk. The actu
271a0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  al size of the.*
271b0 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e  * created mappin
271c0 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  g is either the 
271d0 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
271e0 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66  r the value conf
271f0 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67  igured .** using
27200 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
27210 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65  AP_LIMIT, whiche
27220 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a  ver is smaller..
27230 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
27240 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
27250 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  o error occurs (
27260 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70  even if the mapp
27270 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65  ing is not.** re
27280 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73  created as a res
27290 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ult of outstandi
272a0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f  ng references) o
272b0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
272c0 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77  r.** code otherw
272d0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
272e0 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75  nt unixMapfile(u
272f0 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36  nixFile *pFd, i6
27300 34 20 6e 4d 61 70 29 7b 0a 20 20 61 73 73 65 72  4 nMap){.  asser
27310 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46  t( nMap>=0 || pF
27320 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
27330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  );.  assert( nMa
27340 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61  p>0 || (pFd->mma
27350 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d  pSize==0 && pFd-
27360 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20  >pMapRegion==0) 
27370 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46  );.  if( pFd->nF
27380 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75  etchOut>0 ) retu
27390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
273a0 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20   if( nMap<0 ){. 
273b0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
273c0 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
273d0 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
273e0 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
273f0 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61  /.    if( osFsta
27400 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62  t(pFd->h, &statb
27410 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  uf) ){.      ret
27420 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
27430 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
27440 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66    nMap = statbuf
27450 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20  .st_size;.  }.  
27460 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d  if( nMap>pFd->mm
27470 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20  apSizeMax ){.   
27480 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61   nMap = pFd->mma
27490 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20  pSizeMax;.  }.. 
274a0 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20   assert( nMap>0 
274b0 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  || (pFd->mmapSiz
274c0 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61  e==0 && pFd->pMa
274d0 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20  pRegion==0) );. 
274e0 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
274f0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
27500 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46  unixRemapfile(pF
27510 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20  d, nMap);.  }.. 
27520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27530 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
27540 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
27550 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
27560 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
27570 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
27580 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
27590 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
275a0 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
275b0 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
275c0 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
275d0 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
275e0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
275f0 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
27600 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
27610 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
27620 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
27630 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
27640 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
27650 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
27660 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
27670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
27680 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
27690 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
276a0 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
276b0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
276c0 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
276d0 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
276e0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
276f0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
27700 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
27710 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
27720 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
27730 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20  must eventually 
27740 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20  .** release the 
27750 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c  reference by cal
27760 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68  ling unixUnfetch
27770 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
27780 74 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69  t unixFetch(sqli
27790 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
277a0 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
277b0 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69  , void **pp){.#i
277c0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
277d0 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46  P_SIZE>0.  unixF
277e0 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
277f0 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20  File *)fd;   /* 
27800 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
27810 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
27820 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30  #endif.  *pp = 0
27830 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
27840 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
27850 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
27860 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66  eMax>0 ){.    if
27870 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
27880 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  n==0 ){.      in
27890 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69  t rc = unixMapfi
278a0 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20  le(pFd, -1);.   
278b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
278c0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
278d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
278e0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
278f0 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
27900 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
27910 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
27920 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
27930 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
27940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
27950 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
27960 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27970 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  If the third arg
27980 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  ument is non-NUL
27990 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
279a0 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61  ction releases a
279b0 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f   .** reference o
279c0 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61  btained by an ea
279d0 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e  rlier call to un
279e0 69 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  ixFetch(). The s
279f0 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
27a00 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
27a10 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
27a20 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
27a30 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
27a40 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
27a50 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
27a60 68 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69  he unixFetch() i
27a70 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  nvocation. .**.*
27a80 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69  * Or, if the thi
27a90 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  rd argument is N
27aa0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
27ab0 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
27ac0 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69   called .** to i
27ad0 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61  nform the VFS la
27ae0 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64  yer that, accord
27af0 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e  ing to POSIX, an
27b00 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  y existing mappi
27b10 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ng .** may now b
27b20 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
27b30 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
27b40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27b50 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69  unixUnfetch(sqli
27b60 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
27b70 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29  4 iOff, void *p)
27b80 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
27b90 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
27ba0 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
27bb0 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
27bc0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
27bd0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
27be0 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
27bf0 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20  AMETER(iOff);.. 
27c00 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d   /* If p==0 (unm
27c10 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ap the entire fi
27c20 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d  le) then there m
27c30 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61  ust be no outsta
27c40 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74  nding .  ** xFet
27c50 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f  ch references. O
27c60 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e  r, if p!=0 (mean
27c70 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65  ing it is an xFe
27c80 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a  tch reference),.
27c90 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
27ca0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
27cb0 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
27cc0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27cd0 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46  (p==0)==(pFd->nF
27ce0 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a  etchOut==0) );..
27cf0 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74    /* If p!=0, it
27d00 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20   must match the 
27d10 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  iOff value. */. 
27d20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
27d30 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d   p==&((u8 *)pFd-
27d40 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
27d50 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29  f] );..  if( p )
27d60 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63  {.    pFd->nFetc
27d70 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  hOut--;.  }else{
27d80 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69  .    unixUnmapfi
27d90 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
27da0 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
27db0 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c  tchOut>=0 );.#el
27dc0 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
27dd0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
27de0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
27df0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
27e00 45 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64  ETER(iOff);.#end
27e10 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
27e20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27e30 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
27e40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
27e50 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
27e60 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
27e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e80 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
27e90 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
27ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
27ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
27f10 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
27f20 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
27f30 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
27f40 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
27f50 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
27f60 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
27f70 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
27f80 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
27f90 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
27fa0 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
27fb0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
27fc0 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
27fd0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
27fe0 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
27ff0 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
28000 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
28010 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
28020 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
28030 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
28040 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
28050 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
28060 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
28070 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
28080 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
28090 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
280a0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
280b0 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
280c0 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
280d0 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
280e0 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
280f0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
28100 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
28110 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
28120 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
28130 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
28140 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
28150 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
28160 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
28170 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
28180 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
28190 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
281a0 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
281b0 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  or finder-functi
281c0 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74  on F, two object
281d0 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a  s are created:.*
281e0 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20  *.**    (1) The 
281f0 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63  real finder-func
28200 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70  tion named "FImp
28210 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  t()"..**.**    (
28220 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f  2) A constant po
28230 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75  inter to this fu
28240 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73  nction named jus
28250 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  t "F"..**.**.** 
28260 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
28270 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73   F pointer is us
28280 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61  ed as the pAppDa
28290 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53  ta value for VFS
282a0 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65  .** objects.  We
282b0 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73   have to do this
282c0 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74   instead of lett
282d0 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69  ing pAppData poi
282e0 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61  nt.** directly a
282f0 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e  t the finder-fun
28300 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20  ction since C90 
28310 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20  rules prevent a 
28320 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65  void*.** from be
28330 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e   cast into a fun
28340 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a  ction pointer..*
28350 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  *.**.** Each ins
28360 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61  tance of this ma
28370 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77  cro generates tw
28380 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a  o objects:.**.**
28390 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74     *  A constant
283a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
283b0 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20  ods object call 
283c0 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20  METHOD that has 
283d0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  locking.**      
283e0 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c  methods CLOSE, L
283f0 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52  OCK, UNLOCK, CKR
28400 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20  ESLOCK..**.**   
28410 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64  *  An I/O method
28420 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
28430 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74   called FINDER t
28440 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f  hat returns a po
28450 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f  inter.**      to
28460 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65   the METHOD obje
28470 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ct in the previo
28480 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64  us bullet..*/.#d
28490 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28  efine IOMETHODS(
284a0 46 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45  FINDER,METHOD,VE
284b0 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b  RSION,CLOSE,LOCK
284c0 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53  ,UNLOCK,CKLOCK,S
284d0 48 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61  HMMAP)     \.sta
284e0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
284f0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54  3_io_methods MET
28500 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20  HOD = {         
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56            \.   V
28530 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  ERSION,         
28540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
28550 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28570 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c           \.   CL
28580 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
28590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
285a0 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
285d0 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  xRead,          
285e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
285f0 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  d */            
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28620 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
28630 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
28640 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54        \.   unixT
28670 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
28680 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
28690 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ate */          
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79       \.   unixSy
286c0 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
286d0 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
286e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
28710 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
28720 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
28730 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20     \.   LOCK,   
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20      /* xLock */ 
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20    \.   UNLOCK,  
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287c0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20   \.   CKLOCK,   
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28810 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
28820 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  vedLock */      
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28840 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  \.   unixFileCon
28850 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
28860 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
28870 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28890 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  .   unixSectorSi
288a0 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
288b0 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
288c0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
288e0 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61     unixDeviceCha
288f0 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f  racteristics,  /
28900 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c  * xDeviceCapabil
28910 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20  ities */        
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28930 20 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20    SHMMAP,       
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28950 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20   xShmMap */     
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28980 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20   unixShmLock,   
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
289a0 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  xShmLock */     
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289c0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
289d0 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20  unixShmBarrier, 
289e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
289f0 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20  ShmBarrier */   
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
28a20 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  nixShmUnmap,    
28a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
28a40 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20  hmUnmap */      
28a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a60 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28a70 69 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20  ixFetch,        
28a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
28a90 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28ac0 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20  xUnfetch,       
28ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
28ae0 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20  etch */         
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20         \.};     
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
28b60 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
28b70 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23  methods *FINDER#
28b80 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72  #Impl(const char
28b90 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70   *z, unixFile *p
28ba0 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f  ){   \.  UNUSED_
28bb0 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e  PARAMETER(z); UN
28bc0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
28bd0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26      \.  return &
28c00 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20  METHOD;         
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c40 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20     \.}          
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c90 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
28ca0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28cb0 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e  ods *(*const FIN
28cc0 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  DER)(const char*
28cd0 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20  ,unixFile *p)   
28ce0 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23   \.    = FINDER#
28cf0 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  #Impl;../*.** He
28d00 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68  re are all of th
28d10 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
28d20 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  hods objects for
28d30 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
28d40 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
28d50 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74  es.  Functions t
28d60 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  hat return point
28d70 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74  ers to these met
28d80 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  hods.** are also
28d90 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d   created..*/.IOM
28da0 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49  ETHODS(.  posixI
28db0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
28dc0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
28dd0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
28de0 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c   posixIoMethods,
28df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
28e00 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28e10 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
28e20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
28e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
28e40 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64  hared memory and
28e50 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65   mmap are enable
28e60 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
28e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28e80 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
28e90 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
28ec0 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b   */.  unixUnlock
28ed0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28ee0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
28ef0 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
28f00 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
28f10 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
28f20 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
28f30 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  .  unixShmMap   
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28f50 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
28f60 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
28f70 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c   nolockIoFinder,
28f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
28f90 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
28fa0 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  me */.  nolockIo
28fb0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
28fc0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
28fd0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
28fe0 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20  ame */.  3,     
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29000 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
29010 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
29020 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  */.  nolockClose
29030 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
29040 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
29050 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c  */.  nolockLock,
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29070 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
29080 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  /.  nolockUnlock
29090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
290a0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
290b0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b  */.  nolockCheck
290c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f  ReservedLock,  /
290d0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
290e0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
290f0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
29100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
29110 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
29120 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
29130 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
29140 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
29150 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
29160 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
29170 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
29180 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
29190 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
291a0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
291b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291c0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
291d0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
291e0 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c  .  dotlockClose,
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29200 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
29210 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  .  dotlockLock, 
29220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29230 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
29240 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c    dotlockUnlock,
29250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29260 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
29270 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  .  dotlockCheckR
29280 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20  eservedLock, /* 
29290 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
292a0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
292d0 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
292e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
292f0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
29300 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c  .IOMETHODS(.  fl
29310 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
29320 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
29330 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
29340 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68  */.  flockIoMeth
29350 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
29360 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
29370 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
29380 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293a0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
293b0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
293c0 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20    flockClose,   
293d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
293e0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
293f0 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20    flockLock,    
29400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29410 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29420 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20   flockUnlock,   
29430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
29440 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
29450 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65    flockCheckRese
29460 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78  rvedLock,   /* x
29470 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29480 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
29490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294a0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
294b0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
294c0 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58  endif..#if OS_VX
294d0 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
294e0 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20  .  semIoFinder, 
294f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29500 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
29510 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d  name */.  semIoM
29520 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
29530 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
29540 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29550 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
29560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29570 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29580 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
29590 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65  d */.  semXClose
295a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
295b0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
295c0 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c  d */.  semXLock,
295d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295e0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
295f0 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b   */.  semXUnlock
29600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29610 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
29620 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b  d */.  semXCheck
29630 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
29640 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
29650 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
29660 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
29670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29680 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
29690 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
296a0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
296b0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
296c0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
296d0 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
296e0 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
296f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
29700 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
29710 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
29720 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
29730 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
29740 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
29750 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
29760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29770 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
29780 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
29790 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
297a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
297b0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
297c0 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
297d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
297e0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
297f0 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
29800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29810 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
29820 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
29830 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20  vedLock,     /* 
29840 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29850 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29870 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
29880 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
29890 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
298a0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
298b0 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
298c0 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
298d0 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
298e0 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
298f0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
29900 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
29910 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
29920 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
29930 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
29940 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
29950 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
29960 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
29970 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
29980 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
29990 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
299a0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
299b0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
299c0 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
299d0 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
299e0 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
299f0 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
29a00 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
29a10 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
29a20 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
29a30 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
29a40 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
29a50 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
29a60 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
29a70 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
29a80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
29a90 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
29aa0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
29ab0 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
29ac0 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
29ad0 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
29ae0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
29af0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
29b00 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
29b10 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
29b20 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
29b30 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
29b40 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
29b50 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
29b60 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
29b70 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
29b80 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
29b90 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
29ba0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
29bb0 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
29bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
29bd0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29be0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
29bf0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
29c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
29c10 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
29c20 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78  sabled */.  prox
29c30 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  yClose,         
29c40 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
29c50 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
29c60 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  yLock,          
29c70 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29c80 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
29c90 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29ca0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
29cb0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
29cc0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
29cd0 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck,   /* xCheckR
29ce0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
29cf0 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
29d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d10 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
29d20 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
29d30 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e  ./* nfs lockd on
29d40 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e   OSX 10.3+ doesn
29d50 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c  't clear write l
29d60 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64  ocks when a read
29d70 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a   lock is set */.
29d80 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
29d90 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
29da0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
29db0 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
29dc0 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20  .  nfsIoFinder, 
29dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29de0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
29df0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f   name */.  nfsIo
29e00 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
29e10 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
29e20 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
29e30 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
29e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e50 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
29e60 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
29e70 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
29e80 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29e90 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29ea0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
29eb0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29ec0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29ed0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e  ethod */.  nfsUn
29ee0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
29ef0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29f00 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
29f10 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29f20 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck,     /* xChec
29f30 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
29f40 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
29f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f60 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
29f70 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
29f80 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
29f90 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
29fa0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
29fb0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
29fc0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
29fd0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
29fe0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
29ff0 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
2a000 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
2a010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a020 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
2a030 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
2a040 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
2a050 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
2a060 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2a070 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
2a080 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
2a090 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f   MacOSX only..*/
2a0a0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2a0b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a0c0 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
2a0d0 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
2a0e0 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
2a0f0 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
2a100 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a110 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
2a120 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
2a130 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63   open file objec
2a140 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
2a150 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  se file */.){.  
2a160 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2a170 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20  uct Mapping {.  
2a180 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2a190 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20  ilesystem;      
2a1a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73          /* Files
2a1b0 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20  ystem type name 
2a1c0 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  */.    const sql
2a1d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a1e0 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20  *pMethods;   /* 
2a1f0 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  Appropriate lock
2a200 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ing method */.  
2a210 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20  } aMap[] = {.   
2a220 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f   { "hfs",    &po
2a230 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
2a240 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20      { "ufs",    
2a250 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
2a260 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22  },.    { "afpfs"
2a270 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
2a280 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73   },.    { "smbfs
2a290 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
2a2a0 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64  s },.    { "webd
2a2b0 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  av", &nolockIoMe
2a2c0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30  thods },.    { 0
2a2d0 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  , 0 }.  };.  int
2a2e0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
2a2f0 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74  tfs fsInfo;.  st
2a300 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
2a310 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
2a320 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
2a330 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
2a340 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
2a350 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2a360 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
2a370 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
2a380 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2a390 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
2a3a0 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2a3b0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20  oMethods;.  }.  
2a3c0 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50  if( statfs(fileP
2a3d0 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
2a3e0 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66   -1 ){.    if( f
2a3f0 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20  sInfo.f_flags & 
2a400 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20  MNT_RDONLY ){.  
2a410 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
2a420 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ckIoMethods;.   
2a430 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
2a440 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
2a450 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tem; i++){.     
2a460 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
2a470 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2a480 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
2a490 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  stem)==0 ){.    
2a4a0 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b      return aMap[
2a4b0 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20  i].pMethods;.   
2a4c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2a4d0 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73    /* Default cas
2a4e0 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e  e. Handles, amon
2a4f0 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73  gst others, "nfs
2a500 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74  "..  ** Test byt
2a510 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
2a520 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74  ng fcntl(). If t
2a530 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73  he call succeeds
2a540 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  , .  ** assume t
2a550 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hat the file-sys
2a560 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53  tem supports POS
2a570 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20  IX style locks. 
2a580 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
2a590 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
2a5a0 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
2a5b0 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
2a5c0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
2a5d0 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
2a5e0 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
2a5f0 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
2a600 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
2a610 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
2a620 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ) {.    if( strc
2a630 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
2a640 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d  pename, "nfs")==
2a650 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
2a660 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b  n &nfsIoMethods;
2a670 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
2a680 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
2a690 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  xIoMethods;.    
2a6a0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
2a6b0 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f  eturn &dotlockIo
2a6c0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
2a6d0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2a6e0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
2a6f0 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c    *(*const autol
2a700 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
2a710 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2a720 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f  e*) = autolockIo
2a730 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
2a740 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
2a750 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2a760 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2a770 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
2a780 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a   OS_VXWORKS./*.*
2a790 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
2a7a0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78 57  function for VxW
2a7b0 6f 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20 73  orks checks to s
2a7c0 65 65 20 69 66 20 70 6f 73 69 78 20 61 64 76 69  ee if posix advi
2a7d0 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20  sory.** locking 
2a7e0 77 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64 6f  works.  If it do
2a7f0 65 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  es, then that is
2a800 20 77 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   what is used.  
2a810 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a  If it does not.*
2a820 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c  * work, then fal
2a830 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73  lback to named s
2a840 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
2a850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
2a860 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2a870 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46  hods *vxworksIoF
2a880 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
2a890 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
2a8a0 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
2a8b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a8c0 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
2a8d0 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
2a8e0 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   /* the open fil
2a8f0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
2a900 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
2a910 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
2a920 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
2a930 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
2a940 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
2a950 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
2a960 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
2a970 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
2a980 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2a990 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
2a9a0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
2a9b0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2a9c0 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66  ..  /* Test if f
2a9d0 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72  cntl() is suppor
2a9e0 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49  ted and use POSI
2a9f0 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20  X style locks.. 
2aa00 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61   ** Otherwise fa
2aa10 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e  ll back to the n
2aa20 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d  amed semaphore m
2aa30 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  ethod..  */.  lo
2aa40 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
2aa50 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
2aa60 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
2aa70 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
2aa80 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
2aa90 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
2aaa0 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
2aab0 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
2aac0 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
2aad0 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65  )!=-1 ) {.    re
2aae0 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
2aaf0 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2ab00 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f     return &semIo
2ab10 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
2ab20 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2ab30 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
2ab40 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72    *(*const vxwor
2ab50 6b 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ksIoFinder)(cons
2ab60 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2ab70 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69  *) = vxworksIoFi
2ab80 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
2ab90 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
2aba0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73  */../*.** An abs
2abb0 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61  tract type for a
2abc0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49   pointer to an I
2abd0 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
2abe0 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70  function:.*/.typ
2abf0 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74  edef const sqlit
2ac00 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
2ac10 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f  *finder_type)(co
2ac20 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
2ac30 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  le*);.../*******
2ac40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac80 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2ac90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aca0 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
2acb0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
2acc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2acd0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
2ace0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
2acf0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2ad00 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
2ad10 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
2ad20 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
2ad30 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2ad40 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2ad50 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  f the unixFile s
2ad60 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
2ad70 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73   to by pId..*/.s
2ad80 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
2ad90 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69  UnixFile(.  sqli
2ada0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2adb0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2adc0 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
2add0 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
2ade0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2adf0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
2ae00 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
2ae10 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
2ae20 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20  te3_file *pId,  
2ae30 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
2ae40 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
2ae50 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2ae60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2ae70 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
2ae80 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   of the file bei
2ae90 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
2aea0 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20  nt ctrlFlags    
2aeb0 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f         /* Zero o
2aec0 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f  r more UNIXFILE_
2aed0 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  * values */.){. 
2aee0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2aef0 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b  o_methods *pLock
2af00 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78  ingStyle;.  unix
2af10 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e  File *pNew = (un
2af20 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20  ixFile *)pId;.  
2af30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2af40 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2af50 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c  New->pInode==NUL
2af60 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c  L );..  /* Usual
2af70 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c  ly the path zFil
2af80 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74  ename should not
2af90 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70   be a relative p
2afa0 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a  athname. The.  *
2afb0 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  * exception is w
2afc0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
2afd0 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69  proxy "conch" fi
2afe0 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61  le in builds tha
2aff0 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74  t.  ** include t
2b000 68 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65  he special Apple
2b010 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e   locking styles.
2b020 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
2b030 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2b040 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2b050 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73  CKING_STYLE.  as
2b060 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
2b070 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
2b080 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20  0]=='/' .    || 
2b090 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d  pVfs->pAppData==
2b0a0 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
2b0b0 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73  IoFinder );.#els
2b0c0 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  e.  assert( zFil
2b0d0 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
2b0e0 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  ename[0]=='/' );
2b0f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f  .#endif..  /* No
2b100 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20   locking occurs 
2b110 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  in temporary fil
2b120 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
2b130 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20  zFilename!=0 || 
2b140 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2b150 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30  XFILE_NOLOCK)!=0
2b160 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
2b170 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
2b180 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
2b190 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d  e));.  pNew->h =
2b1a0 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73   h;.  pNew->pVfs
2b1b0 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d   = pVfs;.  pNew-
2b1c0 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  >zPath = zFilena
2b1d0 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c  me;.  pNew->ctrl
2b1e0 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c  Flags = (u8)ctrl
2b1f0 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54  Flags;.#if SQLIT
2b200 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
2b210 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69  0.  pNew->mmapSi
2b220 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
2b230 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
2b240 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ap;.#endif.  if(
2b250 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2b260 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73  lean(((ctrlFlags
2b270 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29   & UNIXFILE_URI)
2b280 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30   ? zFilename : 0
2b290 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
2b2b0 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57  sow", SQLITE_POW
2b2c0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
2b2d0 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  ) ){.    pNew->c
2b2e0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2b2f0 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20  FILE_PSOW;.  }. 
2b300 20 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73   if( strcmp(pVfs
2b310 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78  ->zName,"unix-ex
2b320 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  cl")==0 ){.    p
2b330 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
2b340 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b  = UNIXFILE_EXCL;
2b350 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
2b360 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64  ORKS.  pNew->pId
2b370 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69   = vxworksFindFi
2b380 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  leId(zFilename);
2b390 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64  .  if( pNew->pId
2b3a0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46  ==0 ){.    ctrlF
2b3b0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2b3c0 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20  _NOLOCK;.    rc 
2b3d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2b3e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
2b3f0 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ( ctrlFlags & UN
2b400 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b  IXFILE_NOLOCK ){
2b410 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
2b420 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  le = &nolockIoMe
2b430 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
2b440 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
2b450 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74  e = (**(finder_t
2b460 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44  ype*)pVfs->pAppD
2b470 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  ata)(zFilename, 
2b480 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54  pNew);.#if SQLIT
2b490 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2b4a0 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61  _STYLE.    /* Ca
2b4b0 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e  che zFilename in
2b4c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
2b4d0 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f  text (AFP and do
2b4e0 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20  tlock override) 
2b4f0 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79  for.    ** proxy
2b500 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20  Lock activation 
2b510 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d  is possible (rem
2b520 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73  ote proxy is bas
2b530 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20  ed on db name). 
2b540 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     ** zFilename 
2b550 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
2b560 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  til file is clos
2b570 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a  ed, to support *
2b580 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  /.    pNew->lock
2b590 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f  ingContext = (vo
2b5a0 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23  id*)zFilename;.#
2b5b0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
2b5c0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2b5d0 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  = &posixIoMethod
2b5e0 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  s.#if defined(__
2b5f0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2b600 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b610 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70  G_STYLE.    || p
2b620 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2b630 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65  &nfsIoMethods.#e
2b640 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e  ndif.  ){.    un
2b650 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2b660 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2b670 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2b680 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2b690 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b6a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
2b6b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2b6c0 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65  red in findInode
2b6d0 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68  Info(), close th
2b6e0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2b6f0 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64  r.      ** immed
2b700 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72  iately, before r
2b710 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74  eleasing the mut
2b720 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  ex. findInodeInf
2b730 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20  o() may fail.   
2b740 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65     ** in two sce
2b750 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a  narios:.      **
2b760 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20  .      **   (a) 
2b770 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28  A call to fstat(
2b780 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  ) failed..      
2b790 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f  **   (b) A mallo
2b7a0 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  c failed..      
2b7b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e  **.      ** Scen
2b7c0 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c  ario (b) may onl
2b7d0 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70  y occur if the p
2b7e0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
2b7f0 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20  g no other.     
2b800 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
2b810 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  tors open on the
2b820 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74   same file. If t
2b830 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20  here were other 
2b840 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
2b850 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69  scriptors on thi
2b860 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  s file, then no 
2b870 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20  malloc would be 
2b880 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
2b890 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e    ** findInodeIn
2b8a0 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73  fo(). If this is
2b8b0 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73   the case, it is
2b8c0 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63   quite safe to c
2b8d0 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  lose.      ** ha
2b8e0 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69  ndle h - as it i
2b8f0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
2b900 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73  t no posix locks
2b910 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65   will be release
2b920 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f  d.      ** by do
2b930 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a  ing so..      **
2b940 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65  .      ** If sce
2b950 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64  nario (a) caused
2b960 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20   the error then 
2b970 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73  things are not s
2b980 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20  o safe. The.    
2b990 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73    ** implicit as
2b9a0 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73  sumption here is
2b9b0 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29   that if fstat()
2b9c0 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61   fails, things a
2b9d0 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73  re in.      ** s
2b9e0 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68  uch bad shape th
2b9f0 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f  at dropping a lo
2ba00 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27  ck or two doesn'
2ba10 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20  t matter much.. 
2ba20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f       */.      ro
2ba30 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2ba40 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2ba50 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
2ba60 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2ba70 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69  Mutex();.  }..#i
2ba80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2ba90 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
2baa0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2bab0 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70  __).  else if( p
2bac0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2bad0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
2bae0 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b  .    /* AFP lock
2baf0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2bb00 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2bb10 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
2bb20 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
2bb30 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
2bb40 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66  t..    */.    af
2bb50 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
2bb60 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d  *pCtx;.    pNew-
2bb70 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
2bb80 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33  = pCtx = sqlite3
2bb90 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f  _malloc64( sizeo
2bba0 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
2bbb0 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
2bbc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2bbd0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
2bbe0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
2bbf0 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
2bc00 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
2bc10 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
2bc20 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
2bc30 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
2bc40 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
2bc50 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
2bc60 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
2bc70 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
2bc80 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
2bc90 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
2bca0 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
2bcb0 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
2bcc0 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
2bcd0 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
2bce0 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
2bcf0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
2bd00 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2bd10 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2bd20 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
2bd30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bd40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
2bd50 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
2bd60 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
2bd70 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
2bd80 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2bd90 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2bda0 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
2bdb0 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
2bdc0 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
2bdd0 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
2bde0 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
2bdf0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2be00 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
2be10 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
2be20 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
2be30 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2be40 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2be50 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2be60 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
2be70 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
2be80 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
2be90 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
2bea0 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
2beb0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2bec0 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46  ame!=0 );.    nF
2bed0 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
2bee0 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
2bef0 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
2bf00 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
2bf10 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
2bf20 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
2bf30 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
2bf40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2bf50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2bf60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2bf70 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46  ite3_snprintf(nF
2bf80 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69  ilename, zLockFi
2bf90 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b  le, "%s" DOTLOCK
2bfa0 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61  _SUFFIX, zFilena
2bfb0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
2bfc0 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2bfd0 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b  ext = zLockFile;
2bfe0 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
2bff0 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20  ORKS.  else if( 
2c000 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2c010 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29   &semIoMethods )
2c020 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73  {.    /* Named s
2c030 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
2c040 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
2c050 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
2c060 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63  to be.    ** inc
2c070 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d  luded in the sem
2c080 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20  LockingContext. 
2c090 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e     */.    unixEn
2c0a0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
2c0b0 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2c0c0 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2c0d0 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
2c0e0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
2c0f0 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64   && (pNew->pInod
2c100 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29  e->pSem==NULL) )
2c110 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
2c120 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70  emName = pNew->p
2c130 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b  Inode->aSemName;
2c140 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
2c150 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2c160 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
2c170 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25  E, zSemName, "/%
2c180 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20  s.sem",.        
2c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c1a0 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  New->pId->zCanon
2c1b0 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  icalName);.     
2c1c0 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e   for( n=1; zSemN
2c1d0 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20  ame[n]; n++ ).  
2c1e0 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61        if( zSemNa
2c1f0 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65  me[n]=='/' ) zSe
2c200 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a  mName[n] = '_';.
2c210 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
2c220 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f  de->pSem = sem_o
2c230 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f  pen(zSemName, O_
2c240 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b  CREAT, 0666, 1);
2c250 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
2c260 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d  >pInode->pSem ==
2c270 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
2c280 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2c290 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2c2a0 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
2c2b0 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
2c2c0 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
2c2d0 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2c2e0 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
2c2f0 69 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61 73  if.  .  storeLas
2c300 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b  tErrno(pNew, 0);
2c310 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2c320 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c330 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
2c340 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
2c350 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2c360 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d  NE__);.    h = -
2c370 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  1;.    osUnlink(
2c380 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2c390 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2c3a0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45  |= UNIXFILE_DELE
2c3b0 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  TE;.  }.#endif. 
2c3c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c3d0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
2c3e0 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
2c3f0 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
2c400 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E__);.  }else{. 
2c410 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
2c420 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65   = pLockingStyle
2c430 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
2c440 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72 69 66  r(+1);.    verif
2c450 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20  yDbFile(pNew);. 
2c460 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c470 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2c480 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  the name of a di
2c490 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68  rectory in which
2c4a0 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72   to put temporar
2c4b0 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e  y files..** If n
2c4c0 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f  o suitable tempo
2c4d0 72 61 72 79 20 66 69 6c 65 20 64 69 72 65 63 74  rary file direct
2c4e0 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ory can be found
2c4f0 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
2c500 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
2c510 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c  har *unixTempFil
2c520 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74  eDir(void){.  st
2c530 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2c540 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
2c550 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20     0,.     0,.  
2c560 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20     "/var/tmp",. 
2c570 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a      "/usr/tmp",.
2c580 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
2c590 20 20 22 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73    ".".  };.  uns
2c5a0 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73  igned int i;.  s
2c5b0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2c5c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2c5d0 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d  ir = sqlite3_tem
2c5e0 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 0a 20 20  p_directory;..  
2c5f0 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29  if( !azDirs[0] )
2c600 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74   azDirs[0] = get
2c610 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44  env("SQLITE_TMPD
2c620 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44  IR");.  if( !azD
2c630 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
2c640 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
2c650 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
2c660 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
2c670 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
2c680 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
2c690 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
2c6a0 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
2c6b0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
2c6c0 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
2c6d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c6e0 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
2c6f0 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
2c700 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
2c710 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
2c720 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c730 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2c740 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
2c750 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
2c760 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
2c770 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
2c780 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
2c790 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
2c7a0 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
2c7b0 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
2c7c0 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
2c7d0 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
2c7e0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
2c7f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2c800 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
2c810 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2c820 66 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  f){.  const char
2c830 20 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20 69 4c   *zDir;.  int iL
2c840 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  imit = 0;..  /* 
2c850 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
2c860 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
2c870 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
2c880 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
2c890 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
2c8a0 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
2c8b0 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
2c8c0 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
2c8d0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
2c8e0 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
2c8f0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
2c900 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
2c910 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
2c920 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70   zDir = unixTemp
2c930 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 64 6f 7b  FileDir();.  do{
2c940 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
2c950 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2c960 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72  ss(sizeof(r), &r
2c970 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2c980 42 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a 42 75  Buf>2 );.    zBu
2c990 66 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b 0a 20  f[nBuf-2] = 0;. 
2c9a0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2c9b0 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
2c9c0 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
2c9d0 5f 46 49 4c 45 5f 50 52 45 46 49 58 22 25 6c 6c  _FILE_PREFIX"%ll
2c9e0 78 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x%c",.          
2c9f0 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c             zDir,
2ca00 20 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   r, 0);.    if( 
2ca10 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d 30 20  zBuf[nBuf-2]!=0 
2ca20 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e 31 30  || (iLimit++)>10
2ca30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2ca40 5f 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69 6c 65  _ERROR;.  }while
2ca50 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c  ( osAccess(zBuf,
2ca60 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
2ca70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ca80 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2ca90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2caa0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2cab0 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  LE__)./*.** Rout
2cac0 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  ine to transform
2cad0 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f   a unixFile into
2cae0 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67   a proxy-locking
2caf0 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d   unixFile..** Im
2cb00 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20  plementation in 
2cb10 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64  the proxy-lock d
2cb20 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65  ivision, but use
2cb30 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a  d by unixOpen().
2cb40 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45  ** if SQLITE_PRE
2cb50 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2cb60 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
2cb70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2cb80 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
2cb90 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f  le(unixFile*, co
2cba0 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64  nst char*);.#end
2cbb0 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  if../*.** Search
2cbc0 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
2cbd0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
2cbe0 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  hat was opened o
2cbf0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
2cc00 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  ** file (not a j
2cc10 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72  ournal or master
2cc20 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69  -journal file) i
2cc30 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74  dentified by pat
2cc40 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77  hname.** zPath w
2cc50 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ith SQLITE_OPEN_
2cc60 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69  XXX flags matchi
2cc70 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20  ng those passed 
2cc80 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  as the second.**
2cc90 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2cca0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2ccb0 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65  * Such a file de
2ccc0 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69  scriptor may exi
2ccd0 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65  st if a database
2cce0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
2ccf0 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68  closed.** but th
2cd00 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
2cd10 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75  e descriptor cou
2cd20 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  ld not be closed
2cd30 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a   because some.**
2cd40 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
2cd50 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  riptor open on t
2cd60 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20  he same file is 
2cd70 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c  holding a file-l
2cd80 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f  ock..** Refer to
2cd90 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65   comments in the
2cda0 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e   unixClose() fun
2cdb0 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65  ction and the le
2cdc0 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a  ngthy comment.**
2cdd0 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73   describing "Pos
2cde0 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
2cdf0 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72  ing" at the star
2ce00 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66  t of this file f
2ce10 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64  or .** further d
2ce20 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69  etails. Also, ti
2ce30 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a  cket #4018..**.*
2ce40 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20  * If a suitable 
2ce50 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2ce60 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69  is found, then i
2ce70 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  t is returned. I
2ce80 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c  f no.** such fil
2ce90 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2cea0 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72  located, -1 is r
2ceb0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2cec0 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ic UnixUnusedFd 
2ced0 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28  *findReusableFd(
2cee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2cef0 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  h, int flags){. 
2cf00 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2cf10 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  Unused = 0;..  /
2cf20 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20  * Do not search 
2cf30 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
2cf40 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
2cf50 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65   vxworks. Not be
2cf60 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72  cause.  ** vxwor
2cf70 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e  ks would not ben
2cf80 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68  efit from the ch
2cf90 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20  ange (it might, 
2cfa0 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c  we're not sure),
2cfb0 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73  .  ** but becaus
2cfc0 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74  e no way to test
2cfd0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2cfe0 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69   available. It i
2cff0 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e  s better .  ** n
2d000 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b  ot to risk break
2d010 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70  ing vxworks supp
2d020 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65  ort for the sake
2d030 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63   of such an obsc
2d040 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72  ure .  ** featur
2d050 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56  e.  */.#if !OS_V
2d060 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
2d070 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d090 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74   Results of stat
2d0a0 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a  () call */..  /*
2d0b0 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d   A stat() call m
2d0c0 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69  ay fail for vari
2d0d0 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20  ous reasons. If 
2d0e0 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74  this happens, it
2d0f0 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20   is.  ** almost 
2d100 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20  certain that an 
2d110 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74  open() call on t
2d120 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c  he same path wil
2d130 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a  l also fail..  *
2d140 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f  * For this reaso
2d150 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  n, if an error o
2d160 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61  ccurs in the sta
2d170 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69  t() call here, i
2d180 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65  t is.  ** ignore
2d190 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75  d and -1 is retu
2d1a0 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
2d1b0 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65   will try to ope
2d1c0 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a  n a new file.  *
2d1d0 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  * descriptor on 
2d1e0 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66  the same path, f
2d1f0 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  ail, and return 
2d200 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69  an error to SQLi
2d210 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76  te..  **.  ** Ev
2d220 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65  en if a subseque
2d230 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64  nt open() call d
2d240 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65  oes succeed, the
2d250 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66   consequences of
2d260 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68  .  ** not search
2d270 69 6e 67 20 66 6f 72 20 61 20 72 65 75 73 61 62  ing for a reusab
2d280 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
2d290 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e  or are not dire.
2d2a0 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73    */.  if( 0==os
2d2b0 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74  Stat(zPath, &sSt
2d2c0 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49  at) ){.    unixI
2d2d0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
2d2e0 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ;..    unixEnter
2d2f0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e  Mutex();.    pIn
2d300 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
2d310 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  .    while( pIno
2d320 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66  de && (pInode->f
2d330 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74  ileId.dev!=sStat
2d340 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20  .st_dev.        
2d350 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2d360 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
2d370 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f  no!=sStat.st_ino
2d380 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f  ) ){.       pIno
2d390 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  de = pInode->pNe
2d3a0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
2d3b0 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20  ( pInode ){.    
2d3c0 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2d3d0 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  *pp;.      for(p
2d3e0 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  p=&pInode->pUnus
2d3f0 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29  ed; *pp && (*pp)
2d400 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20  ->flags!=flags; 
2d410 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78  pp=&((*pp)->pNex
2d420 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73  t));.      pUnus
2d430 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20  ed = *pp;.      
2d440 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
2d450 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e         *pp = pUn
2d460 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  used->pNext;.   
2d470 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
2d480 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2d490 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  .  }.#endif    /
2d4a0 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  * if !OS_VXWORKS
2d4b0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e   */.  return pUn
2d4c0 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  used;.}../*.** T
2d4d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2d4e0 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70  called by unixOp
2d4f0 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  en() to determin
2d500 65 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69  e the unix permi
2d510 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65  ssions.** to cre
2d520 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69  ate new files wi
2d530 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  th. If no error 
2d540 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
2d550 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2d560 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75  ed.** and a valu
2d570 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70  e suitable for p
2d580 61 73 73 69 6e 67 20 61 73 20 74 68 65 20 74 68  assing as the th
2d590 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
2d5a0 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72  open(2) is.** wr
2d5b0 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e  itten to *pMode.
2d5c0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2d5d0 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
2d5e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
2d5f0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
2d600 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
2d610 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69  Mode is not modi
2d620 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d  fied..**.** In m
2d630 6f 73 74 20 63 61 73 65 73 2c 20 74 68 69 73 20  ost cases, this 
2d640 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d  routine sets *pM
2d650 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20  ode to 0, which 
2d660 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61  will become.** a
2d670 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
2d680 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f  robust_open() to
2d690 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65   create the file
2d6a0 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45   using.** SQLITE
2d6b0 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
2d6c0 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74  RMISSIONS adjust
2d6d0 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
2d6e0 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66  .** But if the f
2d6f0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2d700 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67   is a WAL or reg
2d710 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
2d720 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
2d730 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65   function querie
2d740 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
2d750 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73  m for the permis
2d760 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a  sions on the .**
2d770 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64   corresponding d
2d780 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2d790 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20   sets *pMode to 
2d7a0 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e  this value. When
2d7b0 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c  ever .** possibl
2d7c0 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e  e, WAL and journ
2d7d0 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  al files are cre
2d7e0 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ated using the s
2d7f0 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ame permissions 
2d800 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63  .** as the assoc
2d810 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
2d820 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
2d830 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
2d840 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e  8_3_NAMES option
2d850 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
2d860 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  n the.** origina
2d870 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e  l filename is un
2d880 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20  available.  But 
2d890 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c  8_3_NAMES is onl
2d8a0 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41  y used for.** FA
2d8b0 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e  T filesystems an
2d8c0 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f  d permissions do
2d8d0 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72   not matter ther
2d8e0 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a  e, so just use.*
2d8f0 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65  * the default pe
2d900 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  rmissions..*/.st
2d910 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65  atic int findCre
2d920 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63  ateFileMode(.  c
2d930 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2d940 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2d950 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28  * Path of file (
2d960 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20  possibly) being 
2d970 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  created */.  int
2d980 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2d990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d9a0 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20  Flags passed as 
2d9b0 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  4th argument to 
2d9c0 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64  xOpen() */.  mod
2d9d0 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20  e_t *pMode,     
2d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d9f0 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73  OUT: Permissions
2da00 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69   to open file wi
2da10 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70  th */.  uid_t *p
2da20 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uid,            
2da30 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2da40 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68  uid to set on th
2da50 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f  e file */.  gid_
2da60 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20  t *pGid         
2da70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2da80 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f  UT: gid to set o
2da90 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  n the file */.){
2daa0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2dab0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2dac0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2dad0 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20  e */.  *pMode = 
2dae0 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a  0;.  *pUid = 0;.
2daf0 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69    *pGid = 0;.  i
2db00 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
2db10 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
2db20 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2db30 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61  RNAL) ){.    cha
2db40 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41  r zDb[MAX_PATHNA
2db50 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61  ME+1];     /* Da
2db60 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68  tabase file path
2db70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b   */.    int nDb;
2db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2dba0 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69  of valid bytes i
2dbb0 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72  n zDb */.    str
2dbc0 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
2dbd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2dbe0 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f  tput of stat() o
2dbf0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2dc00 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68  */..    /* zPath
2dc10 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20   is a path to a 
2dc20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  WAL or journal f
2dc30 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ile. The followi
2dc40 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73  ng block derives
2dc50 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68  .    ** the path
2dc60 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
2dc70 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
2dc80 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69   from zPath. Thi
2dc90 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a  s block handles.
2dca0 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
2dcb0 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76  wing naming conv
2dcc0 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a  entions:.    **.
2dcd0 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2dce0 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a  to db>-journal".
2dcf0 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2dd00 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20  to db>-wal".    
2dd10 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2dd20 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20  b>-journalNN".  
2dd30 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2dd40 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20   db>-walNN".    
2dd50 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20  **.    ** where 
2dd60 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20  NN is a decimal 
2dd70 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e  number. The NN n
2dd80 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72  aming schemes ar
2dd90 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62  e .    ** used b
2dda0 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69  y the test_multi
2ddb0 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20  plex.c module.. 
2ddc0 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20     */.    nDb = 
2ddd0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2dde0 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 20 20 20  zPath) - 1; .   
2ddf0 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44   while( zPath[nD
2de00 62 5d 21 3d 27 2d 27 20 29 7b 0a 23 69 66 6e 64  b]!='-' ){.#ifnd
2de10 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2de20 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 20  _8_3_NAMES.     
2de30 20 2f 2a 20 49 6e 20 74 68 65 20 6e 6f 72 6d 61   /* In the norma
2de40 6c 20 63 61 73 65 20 28 38 2b 33 20 66 69 6c 65  l case (8+3 file
2de50 6e 61 6d 65 73 20 64 69 73 61 62 6c 65 64 29 20  names disabled) 
2de60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2de70 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  name.      ** is
2de80 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 63   guaranteed to c
2de90 6f 6e 74 61 69 6e 20 61 20 27 2d 27 20 63 68 61  ontain a '-' cha
2dea0 72 61 63 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20  racter. */.     
2deb0 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29   assert( nDb>0 )
2dec0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ded0 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
2dee0 50 61 74 68 5b 6e 44 62 5d 29 20 29 3b 0a 23 65  Path[nDb]) );.#e
2def0 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  lse.      /* If 
2df00 38 2b 33 20 6e 61 6d 65 73 20 61 72 65 20 70 6f  8+3 names are po
2df10 73 73 69 62 6c 65 2c 20 74 68 65 6e 20 74 68 65  ssible, then the
2df20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 69   journal file mi
2df30 67 68 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a  ght not contain.
2df40 20 20 20 20 20 20 2a 2a 20 61 20 27 2d 27 20 63        ** a '-' c
2df50 68 61 72 61 63 74 65 72 2e 20 20 53 6f 20 63 68  haracter.  So ch
2df60 65 63 6b 20 66 6f 72 20 74 68 61 74 20 63 61 73  eck for that cas
2df70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 65 61 72  e and return ear
2df80 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ly. */.      if(
2df90 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68   nDb==0 || zPath
2dfa0 5b 6e 44 62 5d 3d 3d 27 2e 27 20 29 20 72 65 74  [nDb]=='.' ) ret
2dfb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
2dfc0 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 44 62 2d  endif.      nDb-
2dfd0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  -;.    }.    mem
2dfe0 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20  cpy(zDb, zPath, 
2dff0 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44  nDb);.    zDb[nD
2e000 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  b] = '\0';..    
2e010 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44  if( 0==osStat(zD
2e020 62 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  b, &sStat) ){.  
2e030 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74      *pMode = sSt
2e040 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37  at.st_mode & 077
2e050 37 3b 0a 20 20 20 20 20 20 2a 70 55 69 64 20 3d  7;.      *pUid =
2e060 20 73 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20   sStat.st_uid;. 
2e070 20 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74       *pGid = sSt
2e080 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d  at.st_gid;.    }
2e090 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2e0a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
2e0b0 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  TAT;.    }.  }el
2e0c0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
2e0d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
2e0e0 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20  EONCLOSE ){.    
2e0f0 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20  *pMode = 0600;. 
2e100 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2e110 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
2e120 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a  e file zPath..**
2e130 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c   .** Previously,
2e140 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c   the SQLite OS l
2e150 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20  ayer used three 
2e160 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61  functions in pla
2e170 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e  ce of this.** on
2e180 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  e:.**.**     sql
2e190 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
2e1a0 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  ite();.**     sq
2e1b0 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
2e1c0 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  nly();.**     sq
2e1d0 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
2e1e0 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  sive();.**.** Th
2e1f0 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73  ese calls corres
2e200 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c  pond to the foll
2e210 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
2e220 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ns of flags:.**.
2e230 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65  **     ReadWrite
2e240 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57  () ->     (READW
2e250 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a  RITE | CREATE).*
2e260 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29  *     ReadOnly()
2e270 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e    ->     (READON
2e280 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e  LY) .**     Open
2e290 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28  Exclusive() -> (
2e2a0 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
2e2b0 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a  TE | EXCLUSIVE).
2e2c0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70  **.** The old Op
2e2d0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63  enExclusive() ac
2e2e0 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e  cepted a boolean
2e2f0 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c   argument - "del
2e300 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75  Flag". If.** tru
2e310 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  e, the file was 
2e320 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65  configured to be
2e330 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
2e340 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a  eleted when the.
2e350 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63  ** file handle c
2e360 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76  losed. To achiev
2e370 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63  e the same effec
2e380 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77  t using this new
2e390 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20   .** interface, 
2e3a0 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e  add the DELETEON
2e3b0 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68  CLOSE flag to th
2e3c0 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62  ose specified ab
2e3d0 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e  ove for .** Open
2e3e0 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a  Exclusive()..*/.
2e3f0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
2e400 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2e410 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2e420 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66      /* The VFS f
2e430 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
2e440 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f   the xOpen metho
2e450 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
2e460 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
2e470 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20      /* Pathname 
2e480 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70  of file to be op
2e490 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
2e4a0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
2e4b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
2e4c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
2e4d0 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f   be filled in */
2e4e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e500 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74  /* Input flags t
2e510 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70  o control the op
2e520 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a  ening */.  int *
2e530 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
2e540 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
2e550 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  t flags returned
2e560 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20   to SQLite core 
2e570 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
2e580 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20   *p = (unixFile 
2e590 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66  *)pFile;.  int f
2e5a0 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
2e5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
2e5c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74  e descriptor ret
2e5d0 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20  urned by open() 
2e5e0 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  */.  int openFla
2e5f0 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
2e600 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
2e610 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a  pass to open() *
2e620 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
2e630 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
2e640 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
2e650 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2e660 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20  int noLock;     
2e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e680 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c  * True to omit l
2e690 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
2e6a0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
2e6b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2e6c0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
2e6d0 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
2e6e0 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  .  int ctrlFlags
2e6f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2e700 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20    /* UNIXFILE_* 
2e710 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  flags */..  int 
2e720 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
2e730 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2e740 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
2e750 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
2e760 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
2e770 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
2e780 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
2e790 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
2e7a0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2e7b0 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
2e7c0 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
2e7d0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2e7e0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2e7f0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
2e800 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
2e810 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e820 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49  WRITE);.#if SQLI
2e830 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2e840 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73  G_STYLE.  int is
2e850 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c  AutoProxy  = (fl
2e860 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2e870 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65  N_AUTOPROXY);.#e
2e880 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
2e890 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53  (__APPLE__) || S
2e8a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2e8b0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72  KING_STYLE.  str
2e8c0 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
2e8d0 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  o;.#endif..  /* 
2e8e0 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61  If creating a ma
2e8f0 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c  ster or main-fil
2e900 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20  e journal, this 
2e910 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70  function will op
2e920 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64  en.  ** a file-d
2e930 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
2e940 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20   directory too. 
2e950 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75  The first time u
2e960 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69  nixSync().  ** i
2e970 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72  s called the dir
2e980 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
2e990 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66  riptor will be f
2e9a0 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f  sync()ed and clo
2e9b0 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e  se()d..  */.  in
2e9c0 74 20 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43  t syncDir = (isC
2e9d0 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20  reate && (.     
2e9e0 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45     eType==SQLITE
2e9f0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
2ea00 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
2ea10 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2ea20 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _MAIN_JOURNAL . 
2ea30 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2ea40 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
2ea50 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67  ));..  /* If arg
2ea60 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61  ument zPath is a
2ea70 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74   NULL pointer, t
2ea80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2ea90 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e  required to open
2eaa0 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  .  ** a temporar
2eab0 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73  y file. Use this
2eac0 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
2ead0 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69   the file name i
2eae0 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a  n..  */.  char z
2eaf0 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Tmpname[MAX_PATH
2eb00 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74  NAME+2];.  const
2eb10 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a   char *zName = z
2eb20 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  Path;..  /* Chec
2eb30 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
2eb40 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
2eb50 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
2eb60 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
2eb70 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
2eb80 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
2eb90 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
2eba0 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
2ebb0 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
2ebc0 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
2ebd0 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
2ebe0 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
2ebf0 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
2ec00 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
2ec10 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
2ec20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
2ec30 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
2ec40 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
2ec50 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
2ec60 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
2ec70 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
2ec80 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
2ec90 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
2eca0 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
2ecb0 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
2ecc0 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
2ecd0 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
2ece0 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
2ecf0 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
2ed00 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
2ed10 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
2ed20 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
2ed30 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
2ed40 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
2ed50 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
2ed60 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
2ed70 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63   .  ** automatic
2ed80 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f  ally deleted. No
2ed90 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
2eda0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
2edb0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
2edc0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
2edd0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
2ede0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
2edf0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
2ee00 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
2ee10 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
2ee20 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2ee30 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
2ee40 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
2ee50 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
2ee60 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2ee70 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
2ee80 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
2ee90 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
2eea0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
2eeb0 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20  _OPEN_WAL );..  
2eec0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
2eed0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
2eee0 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
2eef0 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
2ef00 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
2ef10 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
2ef20 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
2ef30 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2ef40 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
2ef50 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
2ef60 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2ef70 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
2ef80 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2ef90 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
2efa0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
2efb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
2efc0 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
2efd0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2efe0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
2eff0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
2f000 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
2f010 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
2f020 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
2f030 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  AL.  );..  /* De
2f040 74 65 63 74 20 61 20 70 69 64 20 63 68 61 6e 67  tect a pid chang
2f050 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
2f060 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69 73 20  PRNG.  There is 
2f070 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
2f080 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63 68 20  .  ** here such 
2f090 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65  that two or more
2f0a0 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74 72 79   threads all try
2f0b0 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ing to open data
2f0c0 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20 74 68  bases at.  ** th
2f0d0 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d  e same instant m
2f0e0 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74 20 74  ight all reset t
2f0f0 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20 6d 75  he PRNG.  But mu
2f100 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a 20 20  ltiple resets.  
2f110 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73 73 2e  ** are harmless.
2f120 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64  .  */.  if( rand
2f130 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73 47 65 74  omnessPid!=osGet
2f140 70 69 64 28 30 29 20 29 7b 0a 20 20 20 20 72 61  pid(0) ){.    ra
2f150 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73  ndomnessPid = os
2f160 47 65 74 70 69 64 28 30 29 3b 0a 20 20 20 20 73  Getpid(0);.    s
2f170 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
2f180 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 6d  s(0,0);.  }..  m
2f190 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
2f1a0 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a  of(unixFile));..
2f1b0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
2f1c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2f1d0 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73   ){.    UnixUnus
2f1e0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20  edFd *pUnused;. 
2f1f0 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e     pUnused = fin
2f200 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d  dReusableFd(zNam
2f210 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  e, flags);.    i
2f220 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
2f230 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64      fd = pUnused
2f240 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->fd;.    }else{
2f250 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
2f260 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
2f270 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  4(sizeof(*pUnuse
2f280 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  d));.      if( !
2f290 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2f2a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f2b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
2f2c0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e      }.    p->pUn
2f2d0 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
2f2e0 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  .    /* Database
2f2f0 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
2f300 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
2f310 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
2f320 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49  e not.    ** URI
2f330 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
2f340 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
2f350 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
2f360 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ssed into.    **
2f370 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
2f380 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20  ameter(). */.   
2f390 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
2f3a0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
2f3b0 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c  I) || zName[strl
2f3c0 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  en(zName)+1]==0 
2f3d0 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  );..  }else if( 
2f3e0 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a  !zName ){.    /*
2f3f0 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c   If zName is NUL
2f400 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  L, the upper lay
2f410 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  er is requesting
2f420 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f   a temp file. */
2f430 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
2f440 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44 69 72  lete && !syncDir
2f450 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  );.    rc = unix
2f460 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
2f470 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54  ->mxPathname, zT
2f480 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
2f490 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f4a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2f4b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  c;.    }.    zNa
2f4c0 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a  me = zTmpname;..
2f4d0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64      /* Generated
2f4e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e   temporary filen
2f4f0 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  ames are always 
2f500 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
2f510 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f  inated.    ** fo
2f520 72 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33  r use by sqlite3
2f530 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
2f540 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
2f550 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e   zName[strlen(zN
2f560 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20  ame)+1]==0 );.  
2f570 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  }..  /* Determin
2f580 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2f590 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2f5a0 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53  er passed to POS
2f5b0 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  IX function.  **
2f5c0 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d   open(). These m
2f5d0 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65  ust be calculate
2f5e0 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29  d even if open()
2f5f0 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20   is not called, 
2f600 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79  as.  ** they may
2f610 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61   be stored as pa
2f620 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  rt of the file h
2f630 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62  andle and used b
2f640 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e  y the .  ** 'con
2f650 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67  ch file' locking
2f660 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72   functions later
2f670 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69   on.  */.  if( i
2f680 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65  sReadonly )  ope
2f690 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
2f6a0 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  LY;.  if( isRead
2f6b0 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67  Write ) openFlag
2f6c0 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69  s |= O_RDWR;.  i
2f6d0 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20  f( isCreate )   
2f6e0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2f6f0 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45  CREAT;.  if( isE
2f700 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46  xclusive ) openF
2f710 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c  lags |= (O_EXCL|
2f720 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f  O_NOFOLLOW);.  o
2f730 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c  penFlags |= (O_L
2f740 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
2f750 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20  Y);..  if( fd<0 
2f760 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70  ){.    mode_t op
2f770 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  enMode;         
2f780 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69       /* Permissi
2f790 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69  ons to create fi
2f7a0 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75  le with */.    u
2f7b0 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20  id_t uid;       
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f7d0 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66  Userid for the f
2f7e0 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74  ile */.    gid_t
2f7f0 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   gid;           
2f800 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75           /* Grou
2f810 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65  pid for the file
2f820 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e   */.    rc = fin
2f830 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
2f840 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f  zName, flags, &o
2f850 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26  penMode, &uid, &
2f860 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gid);.    if( rc
2f870 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f880 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
2f890 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20  >pUnused );.    
2f8a0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
2f8b0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2f8c0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2f8d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2f8e0 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74  NAL );.      ret
2f8f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2f900 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
2f910 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
2f920 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
2f930 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
2f940 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25  ENX   %-3d %s 0%
2f950 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c  o\n", fd, zName,
2f960 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20   openFlags));.  
2f970 20 20 61 73 73 65 72 74 28 20 21 69 73 45 78 63    assert( !isExc
2f980 6c 75 73 69 76 65 20 7c 7c 20 28 6f 70 65 6e 46  lusive || (openF
2f990 6c 61 67 73 20 26 20 4f 5f 43 52 45 41 54 29 21  lags & O_CREAT)!
2f9a0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 66 64  =0 );.    if( fd
2f9b0 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53  <0 && errno!=EIS
2f9c0 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69  DIR && isReadWri
2f9d0 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  te ){.      /* F
2f9e0 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68  ailed to open th
2f9f0 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f  e file for read/
2fa00 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72  write access. Tr
2fa10 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a  y read-only. */.
2fa20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
2fa30 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
2fa40 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
2fa50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20  EN_CREATE);.    
2fa60 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e    openFlags &= ~
2fa70 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29  (O_RDWR|O_CREAT)
2fa80 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
2fa90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2faa0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65  DONLY;.      ope
2fab0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
2fac0 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64  LY;.      isRead
2fad0 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  only = 1;.      
2fae0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
2faf0 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
2fb00 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
2fb10 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30    }.    if( fd<0
2fb20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
2fb30 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
2fb40 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2fb50 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29  , "open", zName)
2fb60 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
2fb70 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
2fb80 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
2fb90 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e  s process is run
2fba0 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e 64  ning as root and
2fbb0 20 69 66 20 63 72 65 61 74 69 6e 67 20 61 20 6e   if creating a n
2fbc0 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  ew rollback.    
2fbd0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41  ** journal or WA
2fbe0 4c 20 66 69 6c 65 2c 20 73 65 74 20 74 68 65 20  L file, set the 
2fbf0 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
2fc00 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20   journal or WAL 
2fc10 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 74 68 65  to be.    ** the
2fc20 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72 69   same as the ori
2fc30 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a  ginal database..
2fc40 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
2fc50 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
2fc60 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f  PEN_WAL|SQLITE_O
2fc70 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2fc80 29 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  ) ){.      robus
2fc90 74 46 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c  tFchown(fd, uid,
2fca0 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   gid);.    }.  }
2fcb0 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30  .  assert( fd>=0
2fcc0 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   );.  if( pOutFl
2fcd0 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74  ags ){.    *pOut
2fce0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
2fcf0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e   }..  if( p->pUn
2fd00 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70  used ){.    p->p
2fd10 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
2fd20 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
2fd30 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
2fd40 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c    }..  if( isDel
2fd50 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  ete ){.#if OS_VX
2fd60 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20  WORKS.    zPath 
2fd70 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 69 66 20 64  = zName;.#elif d
2fd80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e  efined(SQLITE_UN
2fd90 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45  LINK_AFTER_CLOSE
2fda0 29 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 73 71  ).    zPath = sq
2fdb0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2fdc0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
2fdd0 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 7b 0a  if( zPath==0 ){.
2fde0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2fdf0 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
2fe00 5f 5f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  __);.      retur
2fe10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2fe20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
2fe30 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b  osUnlink(zName);
2fe40 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20  .#endif.  }.#if 
2fe50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2fe60 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c  CKING_STYLE.  el
2fe70 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46  se{.    p->openF
2fe80 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
2fe90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2fea0 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d  noLock = eType!=
2feb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2fec0 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66  _DB;..  .#if def
2fed0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2fee0 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
2fef0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2ff00 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c   if( fstatfs(fd,
2ff10 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
2ff20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
2ff30 45 72 72 6e 6f 28 70 2c 20 65 72 72 6e 6f 29 3b  Errno(p, errno);
2ff40 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
2ff50 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(p, fd, __LINE_
2ff60 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  _);.    return S
2ff70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
2ff80 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  SS;.  }.  if (0 
2ff90 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f  == strncmp("msdo
2ffa0 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  s", fsInfo.f_fst
2ffb0 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
2ffc0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
2ffd0 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c  File)->fsFlags |
2ffe0 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  = SQLITE_FSFLAGS
2fff0 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20  _IS_MSDOS;.  }. 
30000 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d   if (0 == strncm
30010 70 28 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66  p("exfat", fsInf
30020 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
30030 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78  5)) {.    ((unix
30040 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73  File*)pFile)->fs
30050 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
30060 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
30070 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
30080 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f 70  /* Set up approp
30090 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20  riate ctrlFlags 
300a0 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  */.  if( isDelet
300b0 65 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  e )             
300c0 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
300d0 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b  UNIXFILE_DELETE;
300e0 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
300f0 79 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  y )             
30100 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
30110 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20  IXFILE_RDONLY;. 
30120 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20   if( noLock )   
30130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
30140 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
30150 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69  FILE_NOLOCK;.  i
30160 66 28 20 73 79 6e 63 44 69 72 20 29 20 20 20 20  f( syncDir )    
30170 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
30180 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
30190 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66  LE_DIRSYNC;.  if
301a0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
301b0 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c  _OPEN_URI ) ctrl
301c0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
301d0 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49  E_URI;..#if SQLI
301e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
301f0 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49  G_STYLE.#if SQLI
30200 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
30210 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f  LOCKING.  isAuto
30220 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69  Proxy = 1;.#endi
30230 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72  f.  if( isAutoPr
30240 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e  oxy && (zPath!=N
30250 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b  ULL) && (!noLock
30260 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  ) && pVfs->xOpen
30270 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e   ){.    char *en
30280 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28  vforce = getenv(
30290 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52  "SQLITE_FORCE_PR
302a0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20  OXY_LOCKING");. 
302b0 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20     int useProxy 
302c0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c  = 0;..    /* SQL
302d0 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
302e0 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73  LOCKING==1 means
302f0 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73   force always us
30300 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73  e proxy, 0 means
30310 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75   .    ** never u
30320 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d  se proxy, NULL m
30330 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66  eans use proxy f
30340 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  or non-local fil
30350 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  es only.  */.   
30360 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e   if( envforce!=N
30370 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65  ULL ){.      use
30380 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76  Proxy = atoi(env
30390 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65  force)>0;.    }e
303a0 6c 73 65 7b 0a 20 20 20 20 20 20 75 73 65 50 72  lse{.      usePr
303b0 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66  oxy = !(fsInfo.f
303c0 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c  _flags&MNT_LOCAL
303d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
303e0 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20   useProxy ){.   
303f0 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e     rc = fillInUn
30400 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
30410 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63   pFile, zPath, c
30420 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  trlFlags);.     
30430 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
30450 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
30460 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
30470 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
30480 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
30490 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
304a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
304b0 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
304c0 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
304d0 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
304e0 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
304f0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
30500 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
30510 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
30520 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
30530 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
30540 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
30550 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
30560 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
30570 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
30580 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
30590 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
305a0 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
305b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
305c0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
305d0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
305e0 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
305f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
30600 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
30610 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
30620 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
30630 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f  , ctrlFlags);..o
30640 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  pen_finished:.  
30650 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30660 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
30670 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64  _free(p->pUnused
30680 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
30690 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  rc;.}.../*.** De
306a0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74  lete the file at
306b0 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64   zPath. If the d
306c0 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20  irSync argument 
306d0 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  is true, fsync()
306e0 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
306f0 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
30700 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
30710 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c  atic int unixDel
30720 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
30730 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20  fs *NotUsed,    
30740 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69   /* VFS containi
30750 6e 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78  ng this as the x
30760 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f  Delete method */
30770 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
30780 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  Path,        /* 
30790 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
307a0 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
307b0 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20  int dirSync     
307c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
307d0 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69  true, fsync() di
307e0 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
307f0 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29  leting file */.)
30800 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
30810 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44  ITE_OK;.  UNUSED
30820 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
30830 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
30840 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
30850 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
30860 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69  E);.  if( osUnli
30870 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20  nk(zPath)==(-1) 
30880 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f  ){.    if( errno
30890 3d 3d 45 4e 4f 45 4e 54 0a 23 69 66 20 4f 53 5f  ==ENOENT.#if OS_
308a0 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 20 20  VXWORKS.        
308b0 7c 7c 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74  || osAccess(zPat
308c0 68 2c 30 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20  h,0)!=0.#endif. 
308d0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
308e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
308f0 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20  LETE_NOENT;.    
30900 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
30910 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
30920 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
30930 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50  TE, "unlink", zP
30940 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
30950 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
30960 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
30970 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
30980 69 66 28 20 28 64 69 72 53 79 6e 63 20 26 20 31  if( (dirSync & 1
30990 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
309a0 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  fd;.    rc = osO
309b0 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61  penDirectory(zPa
309c0 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66  th, &fd);.    if
309d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
309e0 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
309f0 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  S.      if( fsyn
30a00 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73  c(fd)==-1 ).#els
30a10 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  e.      if( fsyn
30a20 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20  c(fd) ).#endif. 
30a30 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72       {.        r
30a40 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
30a50 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  (SQLITE_IOERR_DI
30a60 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22  R_FSYNC, "fsync"
30a70 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  , zPath);.      
30a80 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  }.      robust_c
30a90 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49  lose(0, fd, __LI
30aa0 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
30ab0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30ac0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
30ad0 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63 20  PEN );.      rc 
30ae0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
30af0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
30b00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30b10 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69  .** Test the exi
30b20 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63 63  stence of or acc
30b30 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ess permissions 
30b40 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54  of file zPath. T
30b50 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f  he.** test perfo
30b60 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rmed depends on 
30b70 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61  the value of fla
30b80 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  gs:.**.**     SQ
30b90 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
30ba0 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TS: Return 1 if 
30bb0 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a  the file exists.
30bc0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
30bd0 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20  CESS_READWRITE: 
30be0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
30bf0 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64  file is read and
30c00 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20   writable..**   
30c10 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
30c20 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e  READONLY: Return
30c30 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
30c40 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a  s readable..**.*
30c50 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75  * Otherwise retu
30c60 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
30c70 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a  int unixAccess(.
30c80 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e    sqlite3_vfs *N
30c90 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65  otUsed,   /* The
30ca0 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
30cb0 74 68 69 73 20 78 41 63 63 65 73 73 20 6d 65 74  this xAccess met
30cc0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
30cd0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
30ce0 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20   /* Path of the 
30cf0 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20  file to examine 
30d00 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
30d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30d20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20  What do we want 
30d30 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74  to learn about t
30d40 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a  he zPath file? *
30d50 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  /.  int *pResOut
30d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
30d70 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c  rite result bool
30d80 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ean here */.){. 
30d90 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30da0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
30db0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
30dc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30dd0 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
30de0 61 73 73 65 72 74 28 20 70 52 65 73 4f 75 74 21  assert( pResOut!
30df0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  =0 );..  /* The 
30e00 73 70 65 63 20 73 61 79 73 20 74 68 65 72 65 20  spec says there 
30e10 61 72 65 20 74 68 72 65 65 20 70 6f 73 73 69 62  are three possib
30e20 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20 66 6c  le values for fl
30e30 61 67 73 2e 20 20 42 75 74 20 6f 6e 6c 79 0a 20  ags.  But only. 
30e40 20 2a 2a 20 74 77 6f 20 6f 66 20 74 68 65 6d 20   ** two of them 
30e50 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65  are actually use
30e60 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 66  d */.  assert( f
30e70 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
30e80 45 53 53 5f 45 58 49 53 54 53 20 7c 7c 20 66 6c  ESS_EXISTS || fl
30e90 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
30ea0 53 53 5f 52 45 41 44 57 52 49 54 45 20 29 3b 0a  SS_READWRITE );.
30eb0 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51  .  if( flags==SQ
30ec0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
30ed0 54 53 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  TS ){.    struct
30ee0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 2a   stat buf;.    *
30ef0 70 52 65 73 4f 75 74 20 3d 20 28 30 3d 3d 6f 73  pResOut = (0==os
30f00 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66  Stat(zPath, &buf
30f10 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65  ) && buf.st_size
30f20 3e 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >0);.  }else{.  
30f30 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 6f 73 41    *pResOut = osA
30f40 63 63 65 73 73 28 7a 50 61 74 68 2c 20 57 5f 4f  ccess(zPath, W_O
30f50 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20 7d 0a  K|R_OK)==0;.  }.
30f60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30f70 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
30f80 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
30f90 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
30fa0 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ll pathname. The
30fb0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a   relative path.*
30fc0 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  * is stored as a
30fd0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
30fe0 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75  string in the bu
30ff0 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
31000 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a  by.** zPath. .**
31010 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20  .** zOut points 
31020 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
31030 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f  t least sqlite3_
31040 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62  vfs.mxPathname b
31050 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69  ytes .** (in thi
31060 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48  s case, MAX_PATH
31070 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65  NAME bytes). The
31080 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72   full-path is wr
31090 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73  itten to.** this
310a0 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72   buffer before r
310b0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
310c0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c  tic int unixFull
310d0 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
310e0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
310f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
31100 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
31110 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
31120 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
31130 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
31140 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
31150 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
31160 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
31170 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
31180 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
31190 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
311a0 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
311b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
311c0 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
311d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  /.){.  int nByte
311e0 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
311f0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
31200 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
31210 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
31220 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
31230 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
31240 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
31250 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
31260 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
31270 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
31280 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
31290 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
312a0 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
312b0 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
312c0 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
312d0 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
312e0 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
312f0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
31300 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
31310 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  R );..  assert( 
31320 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
31330 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29  ==MAX_PATHNAME )
31340 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
31350 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 2f  ETER(pVfs);..  /
31360 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 73  * Attempt to res
31370 6f 6c 76 65 20 74 68 65 20 70 61 74 68 20 61 73  olve the path as
31380 20 69 66 20 69 74 20 77 65 72 65 20 61 20 73 79   if it were a sy
31390 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2e 20 49 66 20  mbolic link. If 
313a0 69 74 20 69 73 0a 20 20 2a 2a 20 61 20 73 79 6d  it is.  ** a sym
313b0 62 6f 6c 69 63 20 6c 69 6e 6b 2c 20 74 68 65 20  bolic link, the 
313c0 72 65 73 6f 6c 76 65 64 20 70 61 74 68 20 69 73  resolved path is
313d0 20 73 74 6f 72 65 64 20 69 6e 20 62 75 66 66 65   stored in buffe
313e0 72 20 7a 4f 75 74 5b 5d 2e 20 4f 72 2c 20 69 66  r zOut[]. Or, if
313f0 0a 20 20 2a 2a 20 74 68 65 20 69 64 65 6e 74 69  .  ** the identi
31400 66 69 65 64 20 66 69 6c 65 20 69 73 20 6e 6f 74  fied file is not
31410 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b   a symbolic link
31420 20 6f 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   or does not exi
31430 73 74 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 7a 50  st, then.  ** zP
31440 61 74 68 20 69 73 20 63 6f 70 69 65 64 20 64 69  ath is copied di
31450 72 65 63 74 6c 79 20 69 6e 74 6f 20 7a 4f 75 74  rectly into zOut
31460 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 6e 42  . Either way, nB
31470 79 74 65 20 69 73 20 6c 65 66 74 20 73 65 74 20  yte is left set 
31480 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65  to.  ** the size
31490 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 63   of the string c
314a0 6f 70 69 65 64 20 69 6e 74 6f 20 7a 4f 75 74 5b  opied into zOut[
314b0 5d 20 69 6e 20 62 79 74 65 73 2e 20 20 2a 2f 0a  ] in bytes.  */.
314c0 20 20 6e 42 79 74 65 20 3d 20 6f 73 52 65 61 64    nByte = osRead
314d0 6c 69 6e 6b 28 7a 50 61 74 68 2c 20 7a 4f 75 74  link(zPath, zOut
314e0 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 69 66 28  , nOut-1);.  if(
314f0 20 6e 42 79 74 65 3c 30 20 29 7b 0a 20 20 20 20   nByte<0 ){.    
31500 69 66 28 20 65 72 72 6e 6f 21 3d 45 49 4e 56 41  if( errno!=EINVA
31510 4c 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e 4f 45  L && errno!=ENOE
31520 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  NT ){.      retu
31530 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
31540 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
31550 42 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e 6b 22  BKPT, "readlink"
31560 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
31570 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
31580 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c  intf(nOut, zOut,
31590 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
315a0 20 20 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74     nByte = sqlit
315b0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29  e3Strlen30(zOut)
315c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
315d0 4f 75 74 5b 6e 42 79 74 65 5d 20 3d 20 27 5c 30  Out[nByte] = '\0
315e0 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ';.  }..  /* If 
315f0 62 75 66 66 65 72 20 7a 4f 75 74 5b 5d 20 6e 6f  buffer zOut[] no
31600 77 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 61 62  w contains an ab
31610 73 6f 6c 75 74 65 20 70 61 74 68 20 74 68 65 72  solute path ther
31620 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  e is nothing mor
31630 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 2e 20 49 66  e.  ** to do. If
31640 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 72   it contains a r
31650 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 64 6f  elative path, do
31660 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
31670 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 6d 6f    **.  **   * mo
31680 76 65 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ve the relative 
31690 70 61 74 68 20 73 74 72 69 6e 67 20 73 6f 20 74  path string so t
316a0 68 61 74 20 69 74 20 69 73 20 61 74 20 74 68 65  hat it is at the
316b0 20 65 6e 64 20 6f 66 20 74 68 0a 20 20 2a 2a 20   end of th.  ** 
316c0 20 20 20 20 7a 4f 75 74 5b 5d 20 62 75 66 66 65      zOut[] buffe
316d0 72 2e 0a 20 20 2a 2a 20 20 20 2a 20 43 61 6c 6c  r..  **   * Call
316e0 20 67 65 74 63 77 64 28 29 20 74 6f 20 72 65 61   getcwd() to rea
316f0 64 20 74 68 65 20 70 61 74 68 20 6f 66 20 74 68  d the path of th
31700 65 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  e current workin
31710 67 20 64 69 72 65 63 74 6f 72 79 20 0a 20 20 2a  g directory .  *
31720 2a 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 73  *     into the s
31730 74 61 72 74 20 6f 66 20 74 68 65 20 7a 4f 75 74  tart of the zOut
31740 5b 5d 20 62 75 66 66 65 72 2e 0a 20 20 2a 2a 20  [] buffer..  ** 
31750 20 20 2a 20 41 70 70 65 6e 64 20 61 20 27 2f 27    * Append a '/'
31760 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 74 68   character to th
31770 65 20 63 77 64 20 73 74 72 69 6e 67 20 61 6e 64  e cwd string and
31780 20 6d 6f 76 65 20 74 68 65 20 0a 20 20 2a 2a 20   move the .  ** 
31790 20 20 20 20 72 65 6c 61 74 69 76 65 20 70 61 74      relative pat
317a0 68 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  h back within th
317b0 65 20 62 75 66 66 65 72 20 73 6f 20 74 68 61 74  e buffer so that
317c0 20 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   it immediately 
317d0 0a 20 20 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77  .  **     follow
317e0 73 20 74 68 65 20 27 2f 27 2e 0a 20 20 2a 2a 0a  s the '/'..  **.
317f0 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69    ** This code i
31800 73 20 77 72 69 74 74 65 6e 20 73 6f 20 74 68 61  s written so tha
31810 74 20 69 66 20 74 68 65 20 63 6f 6d 62 69 6e 61  t if the combina
31820 74 69 6f 6e 20 6f 66 20 74 68 65 20 43 57 44 20  tion of the CWD 
31830 61 6e 64 20 72 65 6c 61 74 69 76 65 0a 20 20 2a  and relative.  *
31840 2a 20 70 61 74 68 20 61 72 65 20 6c 61 72 67 65  * path are large
31850 72 20 74 68 61 6e 20 74 68 65 20 61 6c 6c 6f 63  r than the alloc
31860 61 74 65 64 20 73 69 7a 65 20 6f 66 20 7a 4f 75  ated size of zOu
31870 74 5b 5d 20 74 68 65 20 43 57 44 20 69 73 20 73  t[] the CWD is s
31880 69 6c 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 75  ilently.  ** tru
31890 6e 63 61 74 65 64 20 74 6f 20 6d 61 6b 65 20 69  ncated to make i
318a0 74 20 66 69 74 2e 20 54 68 69 73 20 69 73 20 4f  t fit. This is O
318b0 6b 2c 20 61 73 20 53 51 4c 69 74 65 20 72 65 66  k, as SQLite ref
318c0 75 73 65 73 20 74 6f 20 6f 70 65 6e 20 61 6e 79  uses to open any
318d0 0a 20 20 2a 2a 20 66 69 6c 65 20 66 6f 72 20 77  .  ** file for w
318e0 68 69 63 68 20 74 68 69 73 20 66 75 6e 63 74 69  hich this functi
318f0 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 66 75 6c  on returns a ful
31900 6c 20 70 61 74 68 20 6c 61 72 67 65 72 20 74 68  l path larger th
31910 61 6e 20 28 6e 4f 75 74 2d 38 29 0a 20 20 2a 2a  an (nOut-8).  **
31920 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
31930 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
31940 6e 42 79 74 65 3d 3d 6e 4f 75 74 2d 35 20 29 3b  nByte==nOut-5 );
31950 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 42 79  .  testcase( nBy
31960 74 65 3d 3d 6e 4f 75 74 2d 34 20 29 3b 0a 20 20  te==nOut-4 );.  
31970 69 66 28 20 7a 4f 75 74 5b 30 5d 21 3d 27 2f 27  if( zOut[0]!='/'
31980 20 26 26 20 6e 42 79 74 65 3c 6e 4f 75 74 2d 34   && nByte<nOut-4
31990 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64   ){.    int nCwd
319a0 3b 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d  ;.    int nRem =
319b0 20 6e 4f 75 74 2d 6e 42 79 74 65 2d 31 3b 0a 20   nOut-nByte-1;. 
319c0 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a 4f 75 74     memmove(&zOut
319d0 5b 6e 52 65 6d 5d 2c 20 7a 4f 75 74 2c 20 6e 42  [nRem], zOut, nB
319e0 79 74 65 2b 31 29 3b 0a 20 20 20 20 7a 4f 75 74  yte+1);.    zOut
319f0 5b 6e 52 65 6d 2d 31 5d 20 3d 20 27 5c 30 27 3b  [nRem-1] = '\0';
31a00 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63 77  .    if( osGetcw
31a10 64 28 7a 4f 75 74 2c 20 6e 52 65 6d 2d 31 29 3d  d(zOut, nRem-1)=
31a20 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
31a30 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
31a40 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
31a50 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20  BKPT, "getcwd", 
31a60 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
31a70 20 20 6e 43 77 64 20 3d 20 73 71 6c 69 74 65 33    nCwd = sqlite3
31a80 53 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a  Strlen30(zOut);.
31a90 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 77 64      assert( nCwd
31aa0 3c 3d 6e 52 65 6d 2d 31 20 29 3b 0a 20 20 20 20  <=nRem-1 );.    
31ab0 7a 4f 75 74 5b 6e 43 77 64 5d 20 3d 20 27 2f 27  zOut[nCwd] = '/'
31ac0 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a  ;.    memmove(&z
31ad0 4f 75 74 5b 6e 43 77 64 2b 31 5d 2c 20 26 7a 4f  Out[nCwd+1], &zO
31ae0 75 74 5b 6e 52 65 6d 5d 2c 20 6e 42 79 74 65 2b  ut[nRem], nByte+
31af0 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  1);.  }..  retur
31b00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
31b10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31b20 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
31b30 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
31b40 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
31b50 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
31b60 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
31b70 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
31b80 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
31b90 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
31ba0 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
31bb0 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
31bc0 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74  e <dlfcn.h>.stat
31bd0 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f  ic void *unixDlO
31be0 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
31bf0 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20  *NotUsed, const 
31c00 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
31c10 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
31c20 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
31c30 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a   return dlopen(z
31c40 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e  Filename, RTLD_N
31c50 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c  OW | RTLD_GLOBAL
31c60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69  );.}../*.** SQLi
31c70 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
31c80 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  nction immediate
31c90 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ly after a call 
31ca0 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f  to unixDlSym() o
31cb0 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28  r.** unixDlOpen(
31cc0 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73  ) fails (returns
31cd0 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29   a null pointer)
31ce0 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61  . If a more deta
31cf0 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65  iled error.** me
31d00 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62  ssage is availab
31d10 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65  le, it is writte
31d20 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66  n to zBufOut. If
31d30 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   no error messag
31d40 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
31d50 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65  e, zBufOut is le
31d60 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e  ft unmodified an
31d70 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20  d SQLite uses a 
31d80 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72  default.** error
31d90 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61   message..*/.sta
31da0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45  tic void unixDlE
31db0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
31dc0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
31dd0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
31de0 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ut){.  const cha
31df0 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45  r *zErr;.  UNUSE
31e00 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
31e10 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  sed);.  unixEnte
31e20 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72  rMutex();.  zErr
31e30 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20   = dlerror();.  
31e40 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
31e50 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
31e60 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20  (nBuf, zBufOut, 
31e70 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d  "%s", zErr);.  }
31e80 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
31e90 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  x();.}.static vo
31ea0 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73  id (*unixDlSym(s
31eb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31ec0 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f  sed, void *p, co
31ed0 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28  nst char*zSym))(
31ee0 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a  void){.  /* .  *
31ef0 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61  * GCC with -peda
31f00 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73  ntic-errors says
31f10 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e   that C90 does n
31f20 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a  ot allow a void*
31f30 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74   to be.  ** cast
31f40 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
31f50 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
31f60 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72  And yet the libr
31f70 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74  ary dlsym() rout
31f80 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  ine.  ** returns
31f90 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69   a void* which i
31fa0 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74  s really a point
31fb0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
31fc0 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a  .  So how do we.
31fd0 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29    ** use dlsym()
31fe0 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
31ff0 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a  errors?.  **.  *
32000 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c  * Variable x bel
32010 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  ow is defined to
32020 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
32030 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69   a function taki
32040 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65  ng.  ** paramete
32050 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e  rs void* and con
32060 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74  st char* and ret
32070 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  urning a pointer
32080 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a   to a function..
32090 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69    ** We initiali
320a0 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e  ze x by assignin
320b0 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74  g it a pointer t
320c0 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75  o the dlsym() fu
320d0 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68  nction..  ** (Th
320e0 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65  at assignment re
320f0 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20  quires a cast.) 
32100 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68   Then we call th
32110 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  e function that.
32120 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f    ** x points to
32130 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
32140 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  is work-around i
32150 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f  s unlikely to wo
32160 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20  rk correctly on 
32170 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65  any system where
32180 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79  .  ** you really
32190 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66   cannot cast a f
321a0 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
321b0 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74  into void*.  But
321c0 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20   then, on the.  
321d0 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64  ** other hand, d
321e0 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20  lsym() will not 
321f0 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73  work on such a s
32200 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f  ystem either, so
32210 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f   we have.  ** no
32220 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e  t really lost an
32230 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76  ything..  */.  v
32240 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a  oid (*(*x)(void*
32250 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76  ,const char*))(v
32260 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  oid);.  UNUSED_P
32270 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32280 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a  );.  x = (void(*
32290 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  (*)(void*,const 
322a0 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c  char*))(void))dl
322b0 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a  sym;.  return (*
322c0 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73  x)(p, zSym);.}.s
322d0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
322e0 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
322f0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
32300 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
32310 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
32320 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c  NotUsed);.  dlcl
32330 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  ose(pHandle);.}.
32340 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
32350 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
32360 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
32370 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
32380 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20  unixDlOpen  0.  
32390 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72  #define unixDlEr
323a0 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
323b0 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20  unixDlSym   0.  
323c0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c  #define unixDlCl
323d0 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ose 0.#endif../*
323e0 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62  .** Write nBuf b
323f0 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64  ytes of random d
32400 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ata to the suppl
32410 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e  ied buffer zBuf.
32420 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
32430 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  nixRandomness(sq
32440 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
32450 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
32460 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
32470 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
32480 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  tUsed);.  assert
32490 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28  ((size_t)nBuf>=(
324a0 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73  sizeof(time_t)+s
324b0 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20  izeof(int)));.. 
324c0 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
324d0 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
324e0 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
324f0 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
32500 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
32510 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
32520 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
32530 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
32540 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
32550 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
32560 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
32570 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
32580 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
32590 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
325a0 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
325b0 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
325c0 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
325d0 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
325e0 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
325f0 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
32600 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
32610 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
32620 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
32630 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
32640 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
32650 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
32660 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
32670 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
32680 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
32690 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
326a0 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
326b0 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
326c0 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
326d0 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
326e0 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
326f0 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
32700 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  nce.  This makes
32710 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
32720 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
32730 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
32740 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 61 6e 64  0, nBuf);.  rand
32750 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65  omnessPid = osGe
32760 74 70 69 64 28 30 29 3b 20 20 0a 23 69 66 20 21  tpid(0);  .#if !
32770 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
32780 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  EST) && !defined
32790 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e  (SQLITE_OMIT_RAN
327a0 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a 20 20 20  DOMNESS).  {.   
327b0 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a 20 20   int fd, got;.  
327c0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
327d0 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
327e0 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b  ", O_RDONLY, 0);
327f0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
32800 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
32810 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
32820 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
32830 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
32840 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ));.      memcpy
32850 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29  (&zBuf[sizeof(t)
32860 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73 50 69  ], &randomnessPi
32870 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d  d, sizeof(random
32880 6e 65 73 73 50 69 64 29 29 3b 0a 20 20 20 20 20  nessPid));.     
32890 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
328a0 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d  t)+sizeof(random
328b0 6e 65 73 73 50 69 64 29 3c 3d 28 73 69 7a 65 5f  nessPid)<=(size_
328c0 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
328d0 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
328e0 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d   + sizeof(random
328f0 6e 65 73 73 50 69 64 29 3b 0a 20 20 20 20 7d 65  nessPid);.    }e
32900 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67  lse{.      do{ g
32910 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20  ot = osRead(fd, 
32920 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68  zBuf, nBuf); }wh
32930 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
32940 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
32950 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
32960 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
32970 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
32980 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75  dif.  return nBu
32990 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  f;.}.../*.** Sle
329a0 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
329b0 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
329c0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
329d0 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20  e slept..** The 
329e0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
329f0 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
32a00 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74  econds we want t
32a10 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20  o sleep..** The 
32a20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
32a30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
32a40 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c  croseconds of sl
32a50 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  eep actually.** 
32a60 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
32a70 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
32a80 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20  erating system, 
32a90 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a  a number which.*
32aa0 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74  * might be great
32ab0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
32ac0 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74   to the argument
32ad0 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a  , but not less.*
32ae0 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d  * than the argum
32af0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
32b00 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c  nt unixSleep(sql
32b10 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
32b20 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f  d, int microseco
32b30 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  nds){.#if OS_VXW
32b40 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
32b50 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70  mespec sp;..  sp
32b60 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73  .tv_sec = micros
32b70 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30  econds / 1000000
32b80 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d  ;.  sp.tv_nsec =
32b90 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25   (microseconds %
32ba0 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30   1000000) * 1000
32bb0 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73  ;.  nanosleep(&s
32bc0 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53  p, NULL);.  UNUS
32bd0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
32be0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
32bf0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
32c00 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  lif defined(HAVE
32c10 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
32c20 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70  _USLEEP.  usleep
32c30 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a  (microseconds);.
32c40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32c50 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
32c60 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
32c70 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  ds;.#else.  int 
32c80 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f  seconds = (micro
32c90 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f  seconds+999999)/
32ca0 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70  1000000;.  sleep
32cb0 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  (seconds);.  UNU
32cc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
32cd0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
32ce0 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30   seconds*1000000
32cf0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
32d00 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
32d10 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
32d20 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
32d30 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
32d40 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
32d50 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
32d60 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
32d70 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
32d80 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
32d90 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
32da0 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
32db0 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
32dc0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
32dd0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
32de0 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
32df0 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
32e00 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
32e10 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
32e20 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
32e30 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
32e40 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
32e50 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
32e60 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
32e70 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
32e80 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
32e90 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
32ea0 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
32eb0 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
32ec0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
32ed0 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
32ee0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
32ef0 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
32f00 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
32f10 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
32f20 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
32f30 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
32f40 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
32f50 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
32f60 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
32f70 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
32f80 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ess, return SQLI
32f90 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53  TE_OK.  Return S
32fa0 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74  QLITE_ERROR if t
32fb0 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
32fc0 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66   .** cannot be f
32fd0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
32fe0 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
32ff0 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
33000 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73  _vfs *NotUsed, s
33010 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
33020 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Now){.  static c
33030 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
33040 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
33050 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
33060 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
33070 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33080 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65  E_OK;.#if define
33090 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74  d(NO_GETTOD).  t
330a0 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28  ime_t t;.  time(
330b0 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  &t);.  *piNow = 
330c0 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
330d0 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70  t)*1000 + unixEp
330e0 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58  och;.#elif OS_VX
330f0 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
33100 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20  imespec sNow;.  
33110 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c  clock_gettime(CL
33120 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73  OCK_REALTIME, &s
33130 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  Now);.  *piNow =
33140 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
33150 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
33160 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
33170 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30  Now.tv_nsec/1000
33180 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  000;.#else.  str
33190 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
331a0 3b 0a 20 20 28 76 6f 69 64 29 67 65 74 74 69 6d  ;.  (void)gettim
331b0 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
331c0 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 66 61 69  ;  /* Cannot fai
331d0 6c 20 67 69 76 65 6e 20 76 61 6c 69 64 20 61 72  l given valid ar
331e0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 2a 70 69  guments */.  *pi
331f0 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
33200 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
33210 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
33220 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63  c + sNow.tv_usec
33230 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  /1000;.#endif..#
33240 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
33250 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
33260 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
33270 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
33280 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
33290 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
332a0 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
332b0 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
332c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
332d0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
332e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30  urn rc;.}..#if 0
332f0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
33300 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
33310 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
33320 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
33330 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
33340 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
33350 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
33360 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
33370 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
33380 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
33390 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
333a0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
333b0 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
333c0 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
333d0 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  nt unixCurrentTi
333e0 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
333f0 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20  NotUsed, double 
33400 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74  *prNow){.  sqlit
33410 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a  e3_int64 i = 0;.
33420 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53    int rc;.  UNUS
33430 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
33440 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e  Used);.  rc = un
33450 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
33460 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72  64(0, &i);.  *pr
33470 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
33480 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .0;.  return rc;
33490 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
334a0 65 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  e unixCurrentTim
334b0 65 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  e 0.#endif..#if 
334c0 30 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  0  /* Not used *
334d0 2f 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64  /./*.** We added
334e0 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   the xGetLastErr
334f0 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68  or() method with
33500 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f   the intention o
33510 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62  f providing.** b
33520 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20  etter low-level 
33530 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77  error messages w
33540 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79  hen operating-sy
33550 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f  stem problems co
33560 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20  me up.** during 
33570 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e  SQLite operation
33580 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e  .  But so far, n
33590 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20  one of that has 
335a0 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  been implemented
335b0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  .** in the core.
335c0 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e    So this routin
335d0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
335e0 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20  d.  For now, it 
335f0 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70  is merely.** a p
33600 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a  lace-holder..*/.
33610 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
33620 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
33630 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33640 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
33650 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
33660 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33670 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
33680 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
33690 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
336a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
336b0 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
336c0 72 6e 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  rn 0;.}.#else.# 
336d0 64 65 66 69 6e 65 20 75 6e 69 78 47 65 74 4c 61  define unixGetLa
336e0 73 74 45 72 72 6f 72 20 30 0a 23 65 6e 64 69 66  stError 0.#endif
336f0 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../*.**********
33700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
33710 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  nd of sqlite3_vf
33720 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
33730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33740 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
33750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33790 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
337a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337e0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
337f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33800 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f  * Begin Proxy Lo
33810 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
33820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33830 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f  ******.**.** Pro
33840 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20  xy locking is a 
33850 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65  "uber-locking-me
33860 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65  thod" in this se
33870 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68  nse:  It uses th
33880 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  e.** other locki
33890 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65  ng methods on se
338a0 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c  condary lock fil
338b0 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69  es.  Proxy locki
338c0 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d  ng is a.** meta-
338d0 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f  layer over top o
338e0 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  f the primitive 
338f0 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
33900 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a  ted above.  For.
33910 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  ** this reason, 
33920 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
33930 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20  t implements of 
33940 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
33950 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74   deferred.** unt
33960 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66  il late in the f
33970 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72  ile (here) after
33980 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65   all of the othe
33990 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61  r I/O methods ha
339a0 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e  ve.** been defin
339b0 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65  ed - so that the
339c0 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
339d0 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61  ng methods are a
339e0 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73  vailable.** as s
339f0 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20  ervices to help 
33a00 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65  with the impleme
33a10 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79  ntation of proxy
33a20 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a   locking..**.***
33a30 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  *.**.** The defa
33a40 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  ult locking sche
33a50 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73  mes in SQLite us
33a60 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
33a70 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ks on the.** dat
33a80 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f  abase file to co
33a90 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63  ordinate safe, c
33aa0 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73  oncurrent access
33ab0 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61   by multiple rea
33ac0 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74  ders.** and writ
33ad0 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69  ers [http://sqli
33ae0 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33  te.org/lockingv3
33af0 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76  .html].  The fiv
33b00 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a  e file locking.*
33b10 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b  * states (UNLOCK
33b20 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41  ED, PENDING, SHA
33b30 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45  RED, RESERVED, E
33b40 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d  XCLUSIVE) are im
33b50 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20  plemented.** as 
33b60 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69  POSIX read & wri
33b70 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69  te locks over fi
33b80 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74  xed set of locat
33b90 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29  ions (via fsctl)
33ba0 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20  ,.** on AFP and 
33bb0 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69  SMB only exclusi
33bc0 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  ve byte-range lo
33bd0 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  cks are availabl
33be0 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77  e via fsctl.** w
33bf0 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32  ith _IOWR('z', 2
33c00 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
33c10 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74  ngeLockPB2) to t
33c20 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20  rack the same 5 
33c30 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69  states..** To si
33c40 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b  mulate a F_RDLCK
33c50 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   on the shared r
33c60 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72  ange, on AFP a r
33c70 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64  andomly selected
33c80 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74  .** address in t
33c90 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  he shared range 
33ca0 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53  is taken for a S
33cb0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
33cc0 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64  entire.** shared
33cd0 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
33ce0 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  for an EXCLUSIVE
33cf0 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   lock):.**.**   
33d00 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20     PENDING_BYTE 
33d10 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
33d20 30 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56  0.**      RESERV
33d30 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78  ED_BYTE       0x
33d40 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20  40000001.**     
33d50 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20   SHARED_RANGE   
33d60 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20       0x40000002 
33d70 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a  -> 0x40000200.**
33d80 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77  .** This works w
33d90 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ell on the local
33da0 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75   file system, bu
33db0 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79  t shows a nearly
33dc0 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77   100x.** slowdow
33dd0 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72  n in read perfor
33de0 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63  mance on AFP bec
33df0 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69  ause the AFP cli
33e00 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20  ent disables.** 
33e10 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77  the read cache w
33e20 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  hen byte-range l
33e30 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74  ocks are present
33e40 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20  .  Enabling the 
33e50 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78  read.** cache ex
33e60 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f  poses a cache co
33e70 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20  herency problem 
33e80 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20  that is present 
33e90 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73  on all OS X.** s
33ea0 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b  upported network
33eb0 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20   file systems.  
33ec0 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68  NFS and AFP both
33ed0 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20   observe the.** 
33ee0 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65  close-to-open se
33ef0 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75  mantics for ensu
33f00 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72  ring cache coher
33f10 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f  ency.** [http://
33f20 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e  nfs.sourceforge.
33f30 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68  net/#faq_a8], wh
33f40 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66  ich does not eff
33f50 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72  ectively.** addr
33f60 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d  ess the requirem
33f70 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72  ents for concurr
33f80 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63  ent database acc
33f90 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a  ess by multiple.
33fa0 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  ** readers and w
33fb0 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a  riters.** [http:
33fc0 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d  //www.nabble.com
33fd0 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63  /SQLite-on-NFS-c
33fe0 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74  ache-coherency-t
33ff0 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e  d15655701.html].
34000 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73  .**.** To addres
34010 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  s the performanc
34020 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65  e and cache cohe
34030 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72  rency issues, pr
34040 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
34050 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20  .** changes the 
34060 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63  way database acc
34070 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65  ess is controlle
34080 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63  d by limiting ac
34090 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e  cess to a.** sin
340a0 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69  gle host at a ti
340b0 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69  me and moving fi
340c0 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20  le locks off of 
340d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
340e0 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20  e.** and onto a 
340f0 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68  proxy file on th
34100 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
34110 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  tem.  .**.**.** 
34120 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b  Using proxy lock
34130 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
34140 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41  ------.**.** C A
34150 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  PIs.**.**  sqlit
34160 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
34170 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
34180 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43  TE_FCNTL_SET_LOC
34190 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
341a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341b0 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68       <proxy_path
341c0 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a  > | ":auto:");.*
341d0 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
341e0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
341f0 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  me, SQLITE_FCNTL
34200 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
34210 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  LE,.**          
34220 20 20 20 20 20 20 20 20 20 20 20 20 20 26 3c 70               &<p
34230 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a  roxy_path>);.**.
34240 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61  **.** SQL pragma
34250 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  s.**.**  PRAGMA 
34260 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
34270 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78  proxy_file=<prox
34280 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a  y_path> | :auto:
34290 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
342a0 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
342b0 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65  y_file.**.** Spe
342c0 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22  cifying ":auto:"
342d0 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
342e0 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20  here is a conch 
342f0 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63  file with a matc
34300 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20  hing.** host ID 
34310 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79  in it, the proxy
34320 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e   path in the con
34330 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
34340 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a  used, otherwise.
34350 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20  ** a proxy path 
34360 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65  based on the use
34370 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20  r's temp dir.** 
34380 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53  (via confstr(_CS
34390 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
343a0 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c  P_DIR,...)) will
343b0 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65   be used and the
343c0 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79  .** actual proxy
343d0 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65   file name is ge
343e0 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
343f0 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f   name and path o
34400 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
34410 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61  e file.  For exa
34420 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
34430 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70    For database p
34440 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66  ath "/Users/me/f
34450 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20  oo.db" .**      
34460 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77   The lock path w
34470 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e  ill be "<tmpdir>
34480 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55  /sqliteplocks/_U
34490 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61  sers_me_foo.db:a
344a0 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63  uto:").**.** Onc
344b0 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69  e a lock proxy i
344c0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  s configured for
344d0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
344e0 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e  ection, it can n
344f0 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64  ot.** be removed
34500 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79  , however it may
34510 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20   be switched to 
34520 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78  a different prox
34530 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68  y path via.** th
34540 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73  e above APIs (as
34550 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68  suming the conch
34560 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69   file is not bei
34570 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ng held by anoth
34580 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  er.** connection
34590 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a   or process). .*
345a0 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78  *.**.** How prox
345b0 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a  y locking works.
345c0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
345d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
345e0 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   Proxy file lock
345f0 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61  ing relies prima
34600 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20  rily on two new 
34610 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73  supporting files
34620 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f  : .**.**   *  co
34630 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69  nch file to limi
34640 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  t access to the 
34650 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
34660 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a   a single host.*
34670 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65  *      at a time
34680 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78  .**.**   *  prox
34690 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73  y file to act as
346a0 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65   a proxy for the
346b0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
346c0 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20  normally.**     
346d0 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
346e0 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65  tabase.**.** The
346f0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f   conch file - to
34700 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c   use a proxy fil
34710 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66  e, sqlite must f
34720 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63  irst "hold the c
34730 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69  onch".** by taki
34740 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79  ng an sqlite-sty
34750 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f  le shared lock o
34760 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
34770 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a  , reading the.**
34780 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f   contents and co
34790 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74  mparing the host
347a0 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49  's unique host I
347b0 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e  D (see below) an
347c0 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20  d lock.** proxy 
347d0 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65  path against the
347e0 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
347f0 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68  n the conch.  Th
34800 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a  e conch file is.
34810 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
34820 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
34830 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
34840 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
34850 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74  e name.** is pat
34860 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65  terned after the
34870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
34880 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61  ame as ".<databa
34890 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a  sename>-conch"..
348a0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20  ** If the conch 
348b0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
348c0 69 73 74 2c 20 6f 72 20 69 74 73 20 63 6f 6e 74  ist, or its cont
348d0 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ents do not matc
348e0 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44  h the.** host ID
348f0 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61   and/or proxy pa
34900 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  th, then the loc
34910 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74  k is escalated t
34920 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a  o an exclusive.*
34930 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63  * lock and the c
34940 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e  onch file conten
34950 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ts is updated wi
34960 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  th the host ID a
34970 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68  nd proxy.** path
34980 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73   and the lock is
34990 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
349a0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61   shared lock aga
349b0 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63  in.  If the conc
349c0 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20  h.** is held by 
349d0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
349e0 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c  (with a shared l
349f0 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73  ock), the exclus
34a00 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c  ive lock.** will
34a10 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45   fail and SQLITE
34a20 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
34a30 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  d..**.** The pro
34a40 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67  xy file - a sing
34a50 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65  le-byte file use
34a60 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f  d for all adviso
34a70 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a  ry file locks.**
34a80 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20   normally taken 
34a90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
34aa0 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c  file.   This all
34ab0 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61  ows for safe sha
34ac0 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ring.** of the d
34ad0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
34ae0 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
34af0 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e  s and writers on
34b00 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73   the same.** hos
34b10 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73  t (the conch ens
34b20 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61  ures that they a
34b30 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ll use the same 
34b40 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29  local lock file)
34b50 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69  ..**.** Requesti
34b60 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78  ng the lock prox
34b70 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64  y does not immed
34b80 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20  iately take the 
34b90 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20  conch, it is.** 
34ba0 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20  only taken when 
34bb0 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73  the first reques
34bc0 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61  t to lock databa
34bd0 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e  se file is made.
34be0 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68    .** This match
34bf0 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73  es the semantics
34c00 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f   of the traditio
34c10 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61  nal locking beha
34c20 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f  vior, where.** o
34c30 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74  pening a connect
34c40 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73  ion to a databas
34c50 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
34c60 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69  take a lock on i
34c70 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64  t..** The shared
34c80 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65   lock and an ope
34c90 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
34ca0 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64  r are maintained
34cb0 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63   until .** the c
34cc0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
34cd0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f   database is clo
34ce0 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sed. .**.** The 
34cf0 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74  proxy file and t
34d00 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65  he lock file are
34d10 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73   never deleted s
34d20 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64  o they only need
34d30 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65  .** to be create
34d40 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  d the first time
34d50 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a   they are used..
34d60 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74  **.** Configurat
34d70 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d  ion options.** -
34d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d90 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49  ----.**.**  SQLI
34da0 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
34db0 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LOCKING.**.**   
34dc0 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
34dd0 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e  es accessed on n
34de0 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  on-local file sy
34df0 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20  stems are.**    
34e00 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79     automatically
34e10 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
34e20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c  proxy locking, l
34e30 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a  ock files are.**
34e40 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74         named aut
34e50 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67  omatically using
34e60 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20   the same logic 
34e70 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47  as.**       PRAG
34e80 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  MA lock_proxy_fi
34e90 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20  le=":auto:".**  
34ea0 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52    .**  SQLITE_PR
34eb0 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20  OXY_DEBUG.**.** 
34ec0 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68        Enables th
34ed0 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72  e logging of err
34ee0 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69  or messages duri
34ef0 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a  ng host id file.
34f00 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76  **       retriev
34f10 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a  al and creation.
34f20 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59  **.**  LOCKPROXY
34f30 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  DIR.**.**       
34f40 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65  Overrides the de
34f50 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20  fault directory 
34f60 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72  used for lock pr
34f70 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a  oxy files that.*
34f80 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65  *       are name
34f90 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
34fa0 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22  via the ":auto:"
34fb0 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20   setting.**.**  
34fc0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
34fd0 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
34fe0 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ONS.**.**       
34ff0 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75  Permissions to u
35000 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  se when creating
35010 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72   a directory for
35020 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20   storing the.** 
35030 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79        lock proxy
35040 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65   files, only use
35050 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59  d when LOCKPROXY
35060 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a  DIR is not set..
35070 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a  **    .**    .**
35080 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62   As mentioned ab
35090 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c  ove, when compil
350a0 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50  ed with SQLITE_P
350b0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
350c0 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20  ING,.** setting 
350d0 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  the environment 
350e0 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f  variable SQLITE_
350f0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
35100 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a  ING to 1 will.**
35110 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63   force proxy loc
35120 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20  king to be used 
35130 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61  for every databa
35140 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20  se file opened, 
35150 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f  and 0.** will fo
35160 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72  rce automatic pr
35170 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62  oxy locking to b
35180 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61  e disabled for a
35190 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ll database.** f
351a0 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 6c 79  iles (explicitly
351b0 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c   calling the SQL
351c0 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f  ITE_FCNTL_SET_LO
351d0 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67  CKPROXYFILE prag
351e0 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f  ma or.** sqlite_
351f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49  file_control API
35200 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64   is not affected
35210 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45   by SQLITE_FORCE
35220 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e  _PROXY_LOCKING).
35230 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79  .*/../*.** Proxy
35240 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
35250 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
35260 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66  cOSX .*/.#if def
35270 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
35280 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
35290 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a  _LOCKING_STYLE..
352a0 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c  /*.** The proxyL
352b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61  ockingContext ha
352c0 73 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66  s the path and f
352d0 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ile structures f
352e0 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a  or the remote .*
352f0 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78  * and local prox
35300 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f  y files in it.*/
35310 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
35320 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35330 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  ext proxyLocking
35340 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
35350 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35360 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ext {.  unixFile
35370 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20   *conchFile;    
35380 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
35390 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ch file */.  cha
353a0 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  r *conchFilePath
353b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
353c0 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66  e of the conch f
353d0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
353e0 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20  e *lockProxy;   
353f0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72        /* Open pr
35400 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
35410 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f  .  char *lockPro
35420 78 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  xyPath;         
35430 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
35440 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a  roxy lock file *
35450 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68  /.  char *dbPath
35460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35470 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
35480 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69  open file */.  i
35490 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20  nt conchHeld;   
354a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
354b0 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
354c0 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63   held, -1 if loc
354d0 6b 6c 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  kless */.  int n
354e0 46 61 69 6c 73 3b 20 20 20 20 20 20 20 20 20 20  Fails;          
354f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
35500 72 20 6f 66 20 63 6f 6e 63 68 20 74 61 6b 69 6e  r of conch takin
35510 67 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  g failures */.  
35520 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67  void *oldLocking
35530 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20  Context;     /* 
35540 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  Original locking
35550 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f  context to resto
35560 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20  re on close */. 
35570 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
35580 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d  ods const *pOldM
35590 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72  ethod;     /* Or
355a0 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f  iginal I/O metho
355b0 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a  ds for close */.
355c0 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70  };../* .** The p
355d0 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70  roxy lock file p
355e0 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61  ath for the data
355f0 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69  base at dbPath i
35600 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c  s written into l
35610 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20  Path, .** which 
35620 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61  must point to va
35630 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65  lid, writable me
35640 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67  mory large enoug
35650 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c  h for a maxLen l
35660 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61  ength.** file pa
35670 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  th. .*/.static i
35680 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50  nt proxyGetLockP
35690 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
356a0 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50  dbPath, char *lP
356b0 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c  ath, size_t maxL
356c0 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  en){.  int len;.
356d0 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69    int dbLen;.  i
356e0 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f  nt i;..#ifdef LO
356f0 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e  CKPROXYDIR.  len
35700 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
35710 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20  , LOCKPROXYDIR, 
35720 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23  maxLen);.#else.#
35730 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49   ifdef _CS_DARWI
35740 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a  N_USER_TEMP_DIR.
35750 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e    {.    if( !con
35760 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
35770 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c  USER_TEMP_DIR, l
35780 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b  Path, maxLen) ){
35790 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
357a0 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61  "GETLOCKPATH  fa
357b0 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64  iled %s errno=%d
357c0 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
357d0 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68             lPath
357e0 2c 20 65 72 72 6e 6f 2c 20 6f 73 47 65 74 70 69  , errno, osGetpi
357f0 64 28 30 29 29 29 3b 0a 20 20 20 20 20 20 72 65  d(0)));.      re
35800 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
35810 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  R_LOCK;.    }.  
35820 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28    len = strlcat(
35830 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c  lPath, "sqlitepl
35840 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20  ocks", maxLen); 
35850 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20     .  }.# else. 
35860 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c   len = strlcpy(l
35870 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d  Path, "/tmp/", m
35880 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a  axLen);.# endif.
35890 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50  #endif..  if( lP
358a0 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20  ath[len-1]!='/' 
358b0 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  ){.    len = str
358c0 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c  lcat(lPath, "/",
358d0 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20   maxLen);.  }.  
358e0 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20  .  /* transform 
358f0 74 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61  the db path to a
35900 20 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61   unique cache na
35910 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20  me */.  dbLen = 
35920 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61  (int)strlen(dbPa
35930 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b  th);.  for( i=0;
35940 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c   i<dbLen && (i+l
35950 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65  en+7)<(int)maxLe
35960 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  n; i++){.    cha
35970 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b  r c = dbPath[i];
35980 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e  .    lPath[i+len
35990 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27  ] = (c=='/')?'_'
359a0 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b  :c;.  }.  lPath[
359b0 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73  i+len]='\0';.  s
359c0 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a  trlcat(lPath, ":
359d0 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b  auto:", maxLen);
359e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54  .  OSTRACE(("GET
359f0 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
35a00 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
35a10 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 6f  =%d\n", lPath, o
35a20 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
35a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35a40 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65  ;.}../* . ** Cre
35a50 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69  ates the lock fi
35a60 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69  le and any missi
35a70 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69  ng directories i
35a80 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73  n lockPath. */.s
35a90 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
35aa0 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f  reateLockPath(co
35ab0 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  nst char *lockPa
35ac0 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65  th){.  int i, le
35ad0 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41  n;.  char buf[MA
35ae0 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74  XPATHLEN];.  int
35af0 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20   start = 0;.  . 
35b00 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68   assert(lockPath
35b10 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72  !=NULL);.  /* tr
35b20 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20  y to create all 
35b30 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
35b40 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a   directories */.
35b50 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72    len = (int)str
35b60 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  len(lockPath);. 
35b70 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61   buf[0] = lockPa
35b80 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d  th[0];.  for( i=
35b90 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b  1; i<len; i++ ){
35ba0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74  .    if( lockPat
35bb0 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28  h[i] == '/' && (
35bc0 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29  i - start > 0) )
35bd0 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20  {.      /* only 
35be0 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69  mkdir if leaf di
35bf0 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20  r != "." or "/" 
35c00 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20  or ".." */.     
35c10 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c   if( i-start>2 |
35c20 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26  | (i-start==1 &&
35c30 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
35c40 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  .' && buf[start]
35c50 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20   != '/') .      
35c60 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d     || (i-start==
35c70 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  2 && buf[start] 
35c80 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
35c90 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29  art+1] != '.') )
35ca0 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d  {.        buf[i]
35cb0 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\0';.        i
35cc0 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20  f( osMkdir(buf, 
35cd0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
35ce0 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
35cf0 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ONS) ){.        
35d00 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
35d10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
35d20 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20  rr!=EEXIST ) {. 
35d30 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
35d40 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
35d50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61  ATH  FAILED crea
35d60 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20  ting %s, ".     
35d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d80 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b  "'%s' proxy lock
35d90 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
35da0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
35db0 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74           buf, st
35dc0 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63  rerror(err), loc
35dd0 6b 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28  kPath, osGetpid(
35de0 30 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  0)));.          
35df0 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20    return err;.  
35e00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35e10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
35e20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20    start=i+1;.   
35e30 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20   }.    buf[i] = 
35e40 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d  lockPath[i];.  }
35e50 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45  .  OSTRACE(("CRE
35e60 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  ATELOCKPATH  pro
35e70 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
35e80 70 69 64 3d 25 64 5c 6e 22 2c 6c 6f 63 6b 50 61  pid=%d\n",lockPa
35e90 74 68 2c 6f 73 47 65 74 70 69 64 28 30 29 29 29  th,osGetpid(0)))
35ea0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
35eb0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
35ec0 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64 65 73  new VFS file des
35ed0 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20  criptor (stored 
35ee0 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
35ef0 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
35f00 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f  e3_malloc) and o
35f10 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  pen the file nam
35f20 65 64 20 22 70 61 74 68 22 20 69 6e 20 74 68 65  ed "path" in the
35f30 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
35f40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
35f50 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
35f60 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63  e not only for c
35f70 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  losing the file 
35f80 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75  descriptor.** bu
35f90 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69  t also for freei
35fa0 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73  ng the memory as
35fb0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
35fc0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
35fd0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
35fe0 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
35ff0 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20  File(.    const 
36000 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
36010 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74     /* path for t
36020 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20  he new unixFile 
36030 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  */.    unixFile 
36040 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20  **ppFile,       
36050 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61  /* unixFile crea
36060 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  ted and returned
36070 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69   by ref */.    i
36080 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20  nt islockfile   
36090 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f          /* if no
360a0 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64  n zero missing d
360b0 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61  irs will be crea
360c0 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74  ted */.) {.  int
360d0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78   fd = -1;.  unix
360e0 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
360f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
36100 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
36110 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
36120 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
36130 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
36140 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
36150 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
36160 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
36170 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
36180 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
36190 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
361a0 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
361b0 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
361c0 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
361d0 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
361e0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
361f0 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
36200 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
36210 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
36220 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
36230 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
36240 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
36250 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
36260 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
36270 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
36280 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
36290 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
362a0 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
362b0 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
362c0 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
362d0 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
362e0 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
362f0 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
36300 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
36310 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  c64(sizeof(*pUnu
36320 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21  sed));.    if( !
36330 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
36340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
36350 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
36360 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
36370 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
36380 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
36390 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72  gs, 0);.    terr
363a0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
363b0 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
363c0 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c  o==ENOENT && isl
363d0 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
363e0 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74 65   if( proxyCreate
363f0 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d  LockPath(path) =
36400 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
36410 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75         fd = robu
36420 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
36430 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
36440 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
36450 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
36460 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
36470 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20  DONLY;.    fd = 
36480 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
36490 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b  , openFlags, 0);
364a0 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
364b0 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  rno;.  }.  if( f
364c0 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  d<0 ){.    if( i
364d0 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
364e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
364f0 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
36500 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29   switch (terrno)
36510 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41   {.      case EA
36520 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65  CCES:.        re
36530 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
36540 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f  ;.      case EIO
36550 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  : .        retur
36560 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
36570 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f  OCK; /* even tho
36580 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f  ugh it is the co
36590 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66  nch */.      def
365a0 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65  ault:.        re
365b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
365c0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
365d0 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d  .  }.  .  pNew =
365e0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c   (unixFile *)sql
365f0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69  ite3_malloc64(si
36600 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
36610 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
36620 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
36630 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
36640 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f  o end_create_pro
36650 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  xy;.  }.  memset
36660 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
36670 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70  (unixFile));.  p
36680 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  New->openFlags =
36690 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65   openFlags;.  me
366a0 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20  mset(&dummyVfs, 
366b0 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56  0, sizeof(dummyV
366c0 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73  fs));.  dummyVfs
366d0 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69  .pAppData = (voi
366e0 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
366f0 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73  nder;.  dummyVfs
36700 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22  .zName = "dummy"
36710 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20  ;.  pUnused->fd 
36720 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d  = fd;.  pUnused-
36730 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  >flags = openFla
36740 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75  gs;.  pNew->pUnu
36750 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20  sed = pUnused;. 
36760 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55   .  rc = fillInU
36770 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66  nixFile(&dummyVf
36780 73 2c 20 66 64 2c 20 28 73 71 6c 69 74 65 33 5f  s, fd, (sqlite3_
36790 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68  file*)pNew, path
367a0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
367b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
367c0 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b   *ppFile = pNew;
367d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
367e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63  TE_OK;.  }.end_c
367f0 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20  reate_proxy:    
36800 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
36810 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  pNew, fd, __LINE
36820 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  __);.  sqlite3_f
36830 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c  ree(pNew);.  sql
36840 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65  ite3_free(pUnuse
36850 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
36860 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
36870 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61  E_TEST./* simula
36880 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
36890 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
368a0 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
368b0 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71   paths */.int sq
368c0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
368d0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64   = 0;.#endif..#d
368e0 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54  efine PROXY_HOST
368f0 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20  IDLEN    16  /* 
36900 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20  conch file host 
36910 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 23 69  id length */..#i
36920 66 64 65 66 20 48 41 56 45 5f 47 45 54 48 4f 53  fdef HAVE_GETHOS
36930 54 55 55 49 44 0a 2f 2a 20 4e 6f 74 20 61 6c 77  TUUID./* Not alw
36940 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  ays defined in t
36950 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69 74  he headers as it
36960 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a   ought to be */.
36970 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f  extern int getho
36980 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69 64  stuuid(uuid_t id
36990 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  , const struct t
369a0 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a  imespec *wait);.
369b0 23 65 6e 64 69 66 0a 0a 2f 2a 20 67 65 74 20 74  #endif../* get t
369c0 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20 67  he host ID via g
369d0 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48  ethostuuid(), pH
369e0 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74  ostID must point
369f0 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44   to PROXY_HOSTID
36a00 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66  LEN .** bytes of
36a10 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79   writable memory
36a20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36a30 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75  proxyGetHostID(u
36a40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48  nsigned char *pH
36a50 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72  ostID, int *pErr
36a60 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50 52  or){.  assert(PR
36a70 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d  OXY_HOSTIDLEN ==
36a80 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29   sizeof(uuid_t))
36a90 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74  ;.  memset(pHost
36aa0 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53  ID, 0, PROXY_HOS
36ab0 54 49 44 4c 45 4e 29 3b 0a 23 69 66 64 65 66 20  TIDLEN);.#ifdef 
36ac0 48 41 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44  HAVE_GETHOSTUUID
36ad0 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  .  {.    struct 
36ae0 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74  timespec timeout
36af0 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20   = {1, 0}; /* 1 
36b00 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20  sec timeout */. 
36b10 20 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75     if( gethostuu
36b20 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d  id(pHostID, &tim
36b30 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69  eout) ){.      i
36b40 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a  nt err = errno;.
36b50 20 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72        if( pError
36b60 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72   ){.        *pEr
36b70 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20  ror = err;.     
36b80 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
36b90 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
36ba0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
36bb0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
36bc0 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66  (pError);.#endif
36bd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
36be0 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74  EST.  /* simulat
36bf0 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73  e multiple hosts
36c00 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69   by creating uni
36c10 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  que hostid file 
36c20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73  paths */.  if( s
36c30 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
36c40 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f  m != 0){.    pHo
36c50 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29  stID[0] = (char)
36c60 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63  (pHostID[0] + (c
36c70 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73  har)(sqlite3_hos
36c80 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29  tid_num & 0xFF))
36c90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
36ca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36cb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f  OK;.}../* The co
36cc0 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nch file contain
36cd0 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f  s the header, ho
36ce0 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66  st id and lock f
36cf0 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65  ile path. */.#de
36d00 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48  fine PROXY_CONCH
36d10 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31  VERSION 2   /* 1
36d20 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36  -byte header, 16
36d30 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70  -byte host id, p
36d40 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ath */.#define P
36d50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20  ROXY_HEADERLEN  
36d60 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66    1   /* conch f
36d70 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74  ile header lengt
36d80 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  h */.#define PRO
36d90 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20  XY_PATHINDEX    
36da0 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
36db0 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
36dc0 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  ).#define PROXY_
36dd0 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52  MAXCONCHLEN  (PR
36de0 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
36df0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41  OXY_HOSTIDLEN+MA
36e00 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a  XPATHLEN)../* .*
36e10 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20  * Takes an open 
36e20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69  conch file, copi
36e30 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  es the contents 
36e40 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e  to a new path an
36e50 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a  d then moves .**
36e60 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e   it back.  The n
36e70 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c  ewly created fil
36e80 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  e's file descrip
36e90 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20  tor is assigned 
36ea0 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20  to the.** conch 
36eb0 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  file structure a
36ec0 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f  nd finally the o
36ed0 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69  riginal conch fi
36ee0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
36ef0 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65   .** closed.  Re
36f00 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75  turns zero if su
36f10 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61  ccessful..*/.sta
36f20 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65  tic int proxyBre
36f30 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78  akConchLock(unix
36f40 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69  File *pFile, uui
36f50 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20  d_t myHostID){. 
36f60 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
36f70 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
36f80 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
36f90 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
36fa0 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e  ngContext; .  un
36fb0 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
36fc0 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
36fd0 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74  ile;.  char tPat
36fe0 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
36ff0 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f   char buf[PROXY_
37000 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
37010 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43  char *cPath = pC
37020 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
37030 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64  h;.  size_t read
37040 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f  Len = 0;.  size_
37050 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20  t pathLen = 0;. 
37060 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d   char errmsg[64]
37070 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20   = "";.  int fd 
37080 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d  = -1;.  int rc =
37090 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41   -1;.  UNUSED_PA
370a0 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44  RAMETER(myHostID
370b0 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20  );..  /* create 
370c0 61 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65  a new path by re
370d0 70 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69  place the traili
370e0 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68  ng '-conch' with
370f0 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70   '-break' */.  p
37100 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79  athLen = strlcpy
37110 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d  (tPath, cPath, M
37120 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66  AXPATHLEN);.  if
37130 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54  ( pathLen>MAXPAT
37140 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c  HLEN || pathLen<
37150 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c  6 || .     (strl
37160 63 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c  cpy(&tPath[pathL
37170 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20  en-5], "break", 
37180 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20  6) != 5) ){.    
37190 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
371a0 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
371b0 65 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72  errmsg,"path err
371c0 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e  or (len %d)",(in
371d0 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20  t)pathLen);.    
371e0 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
371f0 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61  ck;.  }.  /* rea
37200 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74  d the conch cont
37210 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e  ent */.  readLen
37220 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68   = osPread(conch
37230 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52  File->h, buf, PR
37240 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c  OXY_MAXCONCHLEN,
37250 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c   0);.  if( readL
37260 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en<PROXY_PATHIND
37270 45 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EX ){.    sqlite
37280 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
37290 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67  f(errmsg),errmsg
372a0 2c 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65  ,"read error (le
372b0 6e 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64  n %d)",(int)read
372c0 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  Len);.    goto e
372d0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
372e0 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20  }.  /* write it 
372f0 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f  out to the tempo
37300 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20  rary break file 
37310 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74  */.  fd = robust
37320 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f  _open(tPath, (O_
37330 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45  RDWR|O_CREAT|O_E
37340 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69 66 28 20  XCL), 0);.  if( 
37350 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  fd<0 ){.    sqli
37360 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
37370 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72  eof(errmsg), err
37380 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69  msg, "create fai
37390 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
373a0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
373b0 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
373c0 20 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64   if( osPwrite(fd
373d0 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20  , buf, readLen, 
373e0 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72  0) != (ssize_t)r
373f0 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71  eadLen ){.    sq
37400 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
37410 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
37420 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61  rrmsg, "write fa
37430 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
37440 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
37450 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
37460 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61    if( rename(tPa
37470 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20  th, cPath) ){.  
37480 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
37490 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
374a0 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61  ), errmsg, "rena
374b0 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  me failed (%d)",
374c0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
374d0 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
374e0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20  .  }.  rc = 0;. 
374f0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
37500 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f   "broke stale lo
37510 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61  ck on %s\n", cPa
37520 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c  th);.  robust_cl
37530 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68  ose(pFile, conch
37540 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
37550 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d  _);.  conchFile-
37560 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68  >h = fd;.  conch
37570 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
37580 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
37590 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f  AT;..end_breaklo
375a0 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ck:.  if( rc ){.
375b0 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
375c0 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
375d0 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f  tPath);.      ro
375e0 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
375f0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
37600 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
37610 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
37620 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c  ed to break stal
37630 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73  e lock on %s, %s
37640 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d  \n", cPath, errm
37650 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
37660 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
37670 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
37680 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
37690 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20   file and break 
376a0 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20  a stale lock if 
376b0 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20  the .** host id 
376c0 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
376d0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63  ic int proxyConc
376e0 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
376f0 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
37700 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b  HostID, int lock
37710 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  Type){.  proxyLo
37720 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
37730 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
37740 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
37750 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
37760 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
37770 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
37780 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69  ->conchFile;.  i
37790 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
377a0 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20  K;.  int nTries 
377b0 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69  = 0;.  struct ti
377c0 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54  mespec conchModT
377d0 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74  ime;.  .  memset
377e0 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c 20  (&conchModTime, 
377f0 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63 68 4d  0, sizeof(conchM
37800 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f 20 7b  odTime));.  do {
37810 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
37820 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
37830 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
37840 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
37850 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72  ckType);.    nTr
37860 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ies ++;.    if( 
37870 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
37880 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
37890 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28  he lock failed (
378a0 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20  busy):.       * 
378b0 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65  1st try: get the
378c0 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65   mod time of the
378d0 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35   conch, wait 0.5
378e0 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
378f0 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74   .       * 2nd t
37900 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20  ry: fail if the 
37910 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64  mod time changed
37920 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64   or host id is d
37930 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a  ifferent, wait .
37940 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20         *        
37950 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72     10 sec and tr
37960 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a  y again.       *
37970 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20   3rd try: break 
37980 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20  the lock unless 
37990 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73  the mod time has
379a0 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20   changed..      
379b0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
379c0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
379d0 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e   if( osFstat(con
379e0 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  chFile->h, &buf)
379f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
37a00 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
37a10 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
37a20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37a30 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
37a40 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
37a50 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29   if( nTries==1 )
37a60 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d  {.        conchM
37a70 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f  odTime = buf.st_
37a80 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20  mtimespec;.     
37a90 20 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 30     usleep(500000
37aa0 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73  ); /* wait 0.5 s
37ab0 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c  ec and try the l
37ac0 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20  ock again*/.    
37ad0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
37ae0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
37af0 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20  ssert( nTries>1 
37b00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e  );.      if( con
37b10 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63  chModTime.tv_sec
37b20 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
37b30 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a  spec.tv_sec || .
37b40 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f           conchMo
37b50 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d  dTime.tv_nsec !=
37b60 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
37b70 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20  c.tv_nsec ){.   
37b80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
37b90 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d  TE_BUSY;.      }
37ba0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
37bb0 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20  ( nTries==2 ){  
37bc0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 74 42  .        char tB
37bd0 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
37be0 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69  HLEN];.        i
37bf0 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64  nt len = osPread
37c00 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74  (conchFile->h, t
37c10 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  Buf, PROXY_MAXCO
37c20 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  NCHLEN, 0);.    
37c30 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b      if( len<0 ){
37c40 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
37c50 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
37c60 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20   errno);.       
37c70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37c80 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
37c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
37ca0 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54  f( len>PROXY_PAT
37cb0 48 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30  HINDEX && tBuf[0
37cc0 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43  ]==(char)PROXY_C
37cd0 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20  ONCHVERSION){.  
37ce0 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74          /* don't
37cf0 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
37d00 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64  if the host id d
37d10 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a  oesn't match */.
37d20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21            if( 0!
37d30 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52  =memcmp(&tBuf[PR
37d40 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20  OXY_HEADERLEN], 
37d50 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f  myHostID, PROXY_
37d60 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20  HOSTIDLEN) ){.  
37d70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
37d80 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
37d90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37db0 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61     /* don't brea
37dc0 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68  k the lock on sh
37dd0 6f 72 74 20 72 65 61 64 20 6f 72 20 61 20 76 65  ort read or a ve
37de0 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a  rsion mismatch *
37df0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
37e00 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
37e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37e20 20 20 75 73 6c 65 65 70 28 31 30 30 30 30 30 30    usleep(1000000
37e30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73  0); /* wait 10 s
37e40 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c  ec and try the l
37e50 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  ock again */.   
37e60 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a       continue; .
37e70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
37e80 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72       assert( nTr
37e90 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ies==3 );.      
37ea0 69 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61  if( 0==proxyBrea
37eb0 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  kConchLock(pFile
37ec0 2c 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20  , myHostID) ){. 
37ed0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
37ee0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
37ef0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43  f( lockType==EXC
37f00 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
37f10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
37f20 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
37f30 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
37f40 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
37f50 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
37f60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37f70 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
37f80 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
37f90 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
37fa0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
37fb0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
37fc0 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20  lockType);.     
37fd0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
37fe0 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63   }.  } while( rc
37ff0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
38000 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a   nTries<3 );.  .
38010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
38020 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e  /* Takes the con
38030 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73  ch by taking a s
38040 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72  hared lock and r
38050 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ead the contents
38060 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c   conch, if .** l
38070 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e  ockPath is non-N
38080 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44  ULL, the host ID
38090 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   and lock file p
380a0 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20  ath must match. 
380b0 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b   A NULL .** lock
380c0 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20  Path means that 
380d0 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20  the lockPath in 
380e0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
380f0 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74  ill be used if t
38100 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20  he .** host IDs 
38110 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20  match, or a new 
38120 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
38130 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f  e generated auto
38140 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e  matically .** an
38150 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  d written to the
38160 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a   conch file..*/.
38170 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
38180 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69  TakeConch(unixFi
38190 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72  le *pFile){.  pr
381a0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
381b0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
381c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
381d0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
381e0 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66  ontext; .  .  if
381f0 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
38200 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d!=0 ){.    retu
38210 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
38220 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46  }else{.    unixF
38230 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
38240 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
38250 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48  ;.    uuid_t myH
38260 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70  ostID;.    int p
38270 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63  Error = 0;.    c
38280 68 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58  har readBuf[PROX
38290 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
382a0 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74      char lockPat
382b0 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
382c0 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63     char *tempLoc
382d0 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  kPath = NULL;.  
382e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
382f0 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72  E_OK;.    int cr
38300 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20  eateConch = 0;. 
38310 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74     int hostIdMat
38320 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
38330 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20  readLen = 0;.   
38340 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50   int tryOldLockP
38350 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ath = 0;.    int
38360 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74   forceNewLockPat
38370 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20  h = 0;.    .    
38380 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f  OSTRACE(("TAKECO
38390 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
383a0 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
383b0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
383c0 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b       (pCtx->lock
383d0 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78  ProxyPath ? pCtx
383e0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
383f0 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 0a 20 20 20  : ":auto:"),.   
38400 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 70            osGetp
38410 69 64 28 30 29 29 29 3b 0a 0a 20 20 20 20 72 63  id(0)));..    rc
38420 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49   = proxyGetHostI
38430 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 72  D(myHostID, &pEr
38440 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 72  ror);.    if( (r
38450 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
38460 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 73  IOERR ){.      s
38470 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
38480 69 6c 65 2c 20 70 45 72 72 6f 72 29 3b 0a 20 20  ile, pError);.  
38490 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
384a0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20  econch;.    }.  
384b0 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63    rc = proxyConc
384c0 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
384d0 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f  ostID, SHARED_LO
384e0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
384f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38500 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
38510 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20  econch;.    }.  
38520 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78    /* read the ex
38530 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c  isting conch fil
38540 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e  e */.    readLen
38550 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28   = seekAndRead((
38560 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46  unixFile*)conchF
38570 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c  ile, 0, readBuf,
38580 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
38590 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61  EN);.    if( rea
385a0 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  dLen<0 ){.      
385b0 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61  /* I/O error: la
385c0 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
385d0 65 65 6b 41